Code Monkey home page Code Monkey logo

contributions-symfony-consolebridge's Introduction

Hoa

Hoa is a modular, extensible and structured set of PHP libraries. Moreover, Hoa aims at being a bridge between industrial and research worlds.

Hoathis\SymfonyConsoleBridge Build Status

All the examples in this readme are available and working in the test application.

Installation

With Composer, to include this library into your dependencies, you need to require hoathis/symfony-console-bridge:

{
    "require": {
        "hoathis/symfony-console-bridge": "~1.0"
    }
}

Please, read the website to get more informations about how to install.

Finally, install dependencies:

$ composer update hoathis/symfony-console-bridge

How to use

Symfony

To use this library with the Symfony framework, please use the dedicated bundle: hoathis/symfony-console-bundle.

Output

Hoathis\SymfonyConsoleBridge\Output\ConsoleOutput is an alternative to the native ConsoleOutput which is able to detect output type and automatically configure verbosity and text decoration.

Let's have the following command:

<?php

$app = new Application();

$app
    ->register('output:verbosity')
    ->setCode(function(InputInterface $input, OutputInterface $output) {
        $output->writeln('<info>I\'m a decorated text only in the console</info>');

        if ($output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL) {
            $output->writeln('I\'ll be displayed with the <comment>normal</comment> verbosity level');
        }

        if ($output->getVerbosity() === OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln('I\'ll be displayed with the <comment>verbose</comment> verbosity level');
        }

        if ($output->getVerbosity() === OutputInterface::VERBOSITY_VERY_VERBOSE) {
            $output->writeln('I\'ll be displayed with the <comment>very verbose</comment> verbosity level');
        }

        if ($output->getVerbosity() === OutputInterface::VERBOSITY_DEBUG) {
            $output->writeln('I\'ll be displayed with the <comment>debug</comment> verbosity level');
        }
    })
;

Running:

$ bin/console output:verbosity
# I'm a decorated text only in the console
# I'll be displayed with the verbose verbosity level

As you will see in your terminal, output will be decorated and verbose by default. However if you run:

$ bin/console output:verbosity > output
$ cat -vet output
# I'm a decorated text only in the console$
# I'll be displayed with the very verbose verbosity level$

The verbosity level will automatically be switched to very verbose because the output has detected that you were redirecting it to a file.

Here are the rules used to determine verbosity level and text decoration support:

Verbosity Decoration
Pipe normal disabled
Redirect very verbose disabled
Terminal verbose enabled

Those rules will only be used if you do not provide any verbosity level using command line arguments. If you want to redirect outputs to a file using the debug verbosity level, simply run:

$ bin/console output:verbosity -vvv > output
$ cat -vet output
# I'm a decorated text only in the console$
# I'll be displayed with the debug verbosity level$

You can still force ANSI output using the --ansi option:

$ bin/console output:verbosity -vvv --ansi | xargs -0 echo -n | cat -vet
# ^[[38;5;189mI'm a decorated text only in the console^[[39;49;0m$
# I'll be displayed with the ^[[38;5;96mdebug^[[39;49;0m verbosity level$

Want to try it? Run bin/console output:verbosity to get a live demo and code snippet.

Formatter

Hoathis\SymfonyConsoleBridge\Formatter\OutputFormatterStyle will let you do everything you were able to do with the native symfony/console formatter with some more cool things:

  • supports xterm-8color color names,
  • supports xterm-256color color codes,
  • automatically translates hexadecimal color codes,
  • supports text styling (normal, bold, underlined, blink and inverse).

To use those new OutputFormatterStyle, use the usual API:

<?php

class Application extends BaseApplication
{
    protected function configureIO(InputInterface $input, OutputInterface $output)
    {
        parent::configureIO($input, $output);

        $formatter = $output->getFormatter();
        $formatter->setStyle('info', new OutputFormatterStyle('#e4cbf4'));
        $formatter->setStyle('comment', new OutputFormatterStyle('#795290'));
        $formatter->setStyle('question', new OutputFormatterStyle('#de8300'));
        $formatter->setStyle('error', new OutputFormatterStyle('white', '#ff3333', array(OutputFormatterStyle::STYLE_BOLD)));
    }

    //...
}

As you can see in the previous example, you can replace built-in styles by simply redifining them with the new formatter.

Want to try it? Run bin/console output:formatter:custom or bin/console output:formatter:native to get a live demo and code snippet.

Helpers

The real power of the library comes from its helpers: they let you manage every terminal components. You will first have to manually load them:

<?php

class Application extends BaseApplication
{
    protected function getDefaultHelperSet()
    {
        $set = parent::getDefaultHelperSet();

        $set->set(new Helper\WindowHelper());
        $set->set(new Helper\CursorHelper());
        $set->set(new Helper\ReadlineHelper());
        $set->set(new Helper\PagerHelper());

        return $set;
    }

    //...
}

Every helper has a dedicated test command. Just run bin/console list to get a list.

Window

The window helper will let you manipulate the current terminal window. It provides several utility methods, each one being bound to an action:

<?php

$app = new Application();

$app
    ->register('helper:window:animate')
    ->setCode(function(InputInterface $input, OutputInterface $output) use ($app) {
        $window = $app->getHelperSet()->get('window');

        $output->writeln('<info>I\'m going to bring your window to the foreground and back to the foreground after one second</info>');
        sleep(1);
        $window->lower($output);
        sleep(1);
        $window->raise($output);

        $output->writeln('<info>I\'m going to minimize your window and restore it after one second</info>');
        sleep(1);
        $window->minimize($output);
        sleep(1);
        $window->restore($output);
    })
;

Many other utility methods are available:

  • setTitle, getTitle, getLabel to manipulate terminal title,
  • setSize, getSize, move, setPosition, getPosition to manipulate window position,
  • minimize, restore, lower, raise to manipulate window placement,
  • scroll, refresh, copy to manipulate window content.

Want to try it? Run bin/console helper:window:animate to get a live demo and code snippet.

Cursor

The cursor helper will let you manipulate the cursor. It provides several utility methods, each one being bound to an action:

<?php

$app = new Application();

$app
    ->register('helper:cursor:draw')
    ->setCode(function(InputInterface $input, OutputInterface $output) use ($app) {
        $window = $app->getHelperSet()->get('cursor');

        $colors = ['red', '#FFCC33', 'yellow', 'green', 'blue', '#003DF5', '#6633FF'];

        $helper = new Helper\CursorHelper();
        $helper->hide($output)->move($output, 'up', 1);

        foreach ($colors as $index => $color) {
            $helper->move($output, 'left', 20 - ($index * 4));
            $output->write(sprintf('<bg=%1$s>%2$s</bg=%1$s>', $color, str_repeat(' ', 20)));

            $helper->move($output, 'down')->move($output, 'left', 20);
            $output->write(sprintf('<bg=%1$s>%2$s</bg=%1$s>', $color, str_repeat(' ', 20)));

            $helper->move($output, 'up')->bip($output);

            usleep(250000);
        }

        $helper
            ->move($output, 'down', 2)
            ->move($output, 'left', 100)
            ->reset($output)
            ->show($output);
    })
;

Many other utility method are available:

  • move, moveTo to change cursor position, getPosition to retrieve the current cursor position,
  • save and restore to save and restore the cursor position,
  • clear to clear whole or part of the screen,
  • hide, show and style to change cursor display options,
  • colorize and reset to manage text styling,
  • bip to emit a bell.

Want to try it? Run bin/console helper:cursor:draw to get a live demo and code snippet.

Readline

The readline helper will help you gather inputs from the user. It provides some methods to ask and validates user's inputs:

  • read will prompt the user for an input,
  • autocomplete will display a prompt and let the user input text and use autocompletion,
  • select will display a list of choices to the user and let him select one or more values,
  • validate will keep asking for an input until it validates against a validator you provide.
<?php

$app = new Application();

$app
    ->register('helper:readline:select')
        ->addOption('multi', null, InputOption::VALUE_NONE)
        ->setCode(function(InputInterface $input, OutputInterface $output) use($app) {
            $readline = $app->getHelperSet()->get('readline');

            $selection = (array) $readline->select(
                $output,
                $input->getOption('multi') ? 'Select some values:' : 'Select a value:',
                [
                    '<info>php</info>' => ReadlineHelper::SEPARATOR,
                    'hoa', 'symfony', 'laravel',
                    '<info>js</info>' => ReadlineHelper::SEPARATOR,
                    'express', 'connect', 'restify',
                ],
                null,
                false,
                $input->getOption('multi')
            );

            $output->writeln(sprintf('<info>You selected</info>: %s', implode(', ', $selection)));
        });

Note that for select you can provide a special choice that will display as a separator using 'label' => ReadlineHelper::SEPARATOR items in you choices list.

Want to try it? Run bin/console helper:readline:select or bin/console helper:readline:autocomplete to get a live demo and code snippet.

Pager

The pager helper will let you display outputs through a pager so the user can easily read and scroll. The helper provides two pagers: less and more. You will have to feed them using a closure wrapping code producing output:

<?php

$app = new Application();

$app
    ->register('helper:pager:less')
        ->setCode(function(InputInterface $input, OutputInterface $output) use($app) {
            $pager = $app->getHelperSet()->get('pager');

            $pager->less(
                $output,
                function() {
                    passthru('cat ' . __DIR__ . '/*.php');
                }
            );
        });

Want to try it? Run bin/console helper:pager:less or bin/console helper:pager:more to get a live demo and code snippet.

Tput

The tput helper will help you get informed about user's terminal capabilities. The helper provides a single entry point to all capabilities: the get method. Here is how you would do to get the clear_screen capability:

<?php

$app = new Application();

$app
    ->register('helper:tput:get')
        ->setCode(function(InputInterface $input, OutputInterface $output) use($app) {
            $tput = new TputHelper();
            $capability = 'clear_screen';
            $value = $tput->get($capability);

            $output->writeln(sprintf('<info>%s</info>: %s', $capability, $value));
        });

Want to try it? Run bin/console helper:tput:capabilities or bin/console helper:tput:echo or bin/console helper:tput:get to get a live demo and code snippet.

contributions-symfony-consolebridge's People

Contributors

hywan avatar jubianchi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

contributions-symfony-consolebridge's Issues

Release policy: Define the Symfony Components targets

Should we target only Symfony's LTS releases or standard ones ?

  • 2.3 : LTS maintained until the end of May 2016
  • 2.4 : Stadard release maintained until the end of July 2014

Things to keep in mind are :

  • LTS will certainly be more used
  • Standard releases will provide latest cool features

Do not deploy `bin/console`

THe file bin/console is only used for test purpose: it should not be part of the delivered code. We should remove the bin-dir configuration from the composer.json file so that the file is not deployed when users require this library

Readme: Link to test app commands

In the readme, we should add a note to each paragraph having a command in the test app. For example, with the window helper:

### Helpers

...

> Every helper has a dedicated test command. Just run `bin/console list``` to get a list.

#### Window

...

> Want to try it? Run `bin/console helper:window:animate``` to get a live demo and code snippet.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.