amercier/php-cli-helpers

View on GitHub
README.md

Summary

Maintainability
Test Coverage
php-cli-helpers
===============

Utility classes to write PHP command-line scripts

[![Build Status](https://img.shields.io/travis/amercier/php-cli-helpers/master.svg?style=flat)](https://travis-ci.org/amercier/php-cli-helpers)
[![Code Climate](https://img.shields.io/codeclimate/github/amercier/php-cli-helpers.svg?style=flat)](https://codeclimate.com/github/amercier/php-cli-helpers)
[![Test Coverage](https://img.shields.io/codeclimate/coverage/github/amercier/php-cli-helpers.svg?style=flat)](https://codeclimate.com/github/amercier/php-cli-helpers)
[![Dependency Status](https://img.shields.io/gemnasium/amercier/php-cli-helpers.svg?style=flat)](https://gemnasium.com/amercier/php-cli-helpers)

[![Latest Stable Version](https://img.shields.io/packagist/v/amercier/cli-helpers.svg)](https://packagist.org/packages/amercier/cli-helpers)
[![PHP version](https://img.shields.io/packagist/php-v/amercier/cli-helpers.svg)](https://packagist.org/packages/amercier/cli-helpers)
[![License](https://img.shields.io/packagist/l/amercier/cli-helpers.svg)](https://packagist.org/packages/amercier/cli-helpers)


Installation
------------

_php-cli-helpers_ is available through [Composer](http://getcomposer.org/).
```json
  "require": {
    "amercier/cli-helpers": "1.*"
  }
```
```bash
php composer.phar install
```

If you are not familiar with _Composer_, please read the
[full installation intructions](docs/install.md).


Usage
-----


### \Cli\Helpers\Parameter

Utility class to handle command-line parameters.

```php
$options = \Cli\Helpers\Parameter::getFromCommandLine(array(
    'host'     => new Parameter('h', 'host'    , '127.0.0.1'),
    'username' => new Parameter('u', 'username', Parameter::VALUE_REQUIRED),
    'password' => new Parameter('p', 'password', Parameter::VALUE_REQUIRED),
    'verbose'  => new Parameter('v', 'verbose' , Parameter::VALUE_NO_VALUE),
));

$options['host'];     // given -h/--host, or 127.0.0.1 otherwise
$options['username']; // given -u/--username
$options['password']; // given -p/--password
$options['verbose'];  // true if -v/--verbose is given, false otherwise
```

See [API Documentation for Parameter](docs/api-parameter.md)


### \Cli\Helpers\Script and \Cli\Helpers\DocumentedScript

Utility class to write scripts as objects.

```php
#!/usr/bin/env php
<?php
require_once dirname(__FILE__) . '/path/to/vendor/autoload.php';

use Cli\Helpers\DocumentedScript;
use Cli\Helpers\Parameter;

$script = new DocumentedScript();
$script
    ->setName('test-documented-script.php')
    ->setVersion('1.0')
    ->setDescription('Test script for Cli\Helpers\DocumentedScript')
    ->setCopyright('Copyright (c) Alexandre Mercier 2014')
    ->addParameter(new Parameter('H', 'host'    , '127.0.0.1')              , 'Host.')
    ->addParameter(new Parameter('u', 'username', Parameter::VALUE_REQUIRED), 'User name.')
    ->addParameter(new Parameter('p', 'password', Parameter::VALUE_REQUIRED), 'Password.')
    ->addParameter(new Parameter('v', 'verbose' , Parameter::VALUE_NO_VALUE), 'Enable verbosity.')
    ->setProgram(function ($options, $arguments) {
        var_dump($arguments);
        var_dump($options);
    })
    ->start();
```

While `Script` doesn't have any pre-configured switch, `DocumentedScript` has
`--h, --help` and `-V, --version`. This provides an automatic handling of this
two switches.

Version example:

`test-documented-script.php -V`
```
test-documented-script.php v1.0
Copyright (c) 2014 Alexandre Mercier
```

Help example:

`test-documented-script.php -h`
```
Usage: test-documented-script.php -p PASSWORD -u USERNAME [OPTIONS]

Test script for Cli\Helpers\DocumentedScript

  -H, --host     HOST        Host (defaults to '127.0.0.1').
  -u, --username USERNAME    User name.
  -p, --password PASSWORD    Password.
  -v, --verbose              Enable verbosity.
  -h, --help                 Display this help and exit.
  -V, --version              Output version information and exit.

test-documented-script.php v1.0
Copyright (c) 2014 Alexandre Mercier
```


### \Cli\Helpers\Job

Utility class to run a job and catch exceptions.

On successful jobs:
```php
\Cli\Helpers\Job::run('Doing awesome stuff', function() {
    ... // awesome stuff
});
```
```
Doing awesome stuff... OK
```

On unsuccessful jobs:
```php
\Cli\Helpers\Job::run('Fighting Chuck Norris', function() {
    ... // throws a RoundHouseKickException('You've received a round-house kick', 'face')
});
```
```
Fighting Chuck Norris... NOK - You've received a round-house kick in the face
```

You can also add parameters to the function:

```php
\Cli\Helpers\Job::run(
    'Doing awesome stuff',
    function($a, $b) {
        $a; // => 1337;
        $b; // => 'good luck, im behind 7 firewalls';
    },
    array(1337, 'im behind 7 firewalls')
});
```

See [API Documentation for Job](docs/api-job.md)


###  \Cli\Helpers\IO

Utility class to handle standard input/output.

#### IO::form

Usage
-----

```php
\Cli\Helpers\IO::form('an apple', array(
    'Golden Delicious',
    'Granny Smith',
    'Pink Lady',
    'Royal Gala',
));
```
will display:
```
1. Golden Delicious
2. Granny Smith
3. Pink Lady
4. Royal Gala

Choose an apple: |
```
Then, user is asked to make a choice between 1 and 3 on standard input.

#### IO::strPadAll

```php
echo IO::strPadAll(
    array( // items
        array('#', 'EN', 'FR', 'ES'),
        '',
        array('1', 'One', 'Un', 'Uno'),
        array('2', 'Two', 'Deux', 'Dos'),
        array('3', 'Three', 'Trois', 'Tres'),
        array('4', 'Four', 'Quatre', 'Cuatro'),
        array('5', 'Five', 'Cinq', 'Cinco'),
    ),
    array( // alignment
        2 => STR_PAD_LEFT,
        3 => STR_PAD_RIGHT,
    ),
    "\n", // line separator
    '   ' // field separator
));
```
will display:
```
#   EN          FR   ES

1   One         Un   Uno
2   Two       Deux   Dos
3   Three    Trois   Tres
4   Four    Quatre   Cuatro
5   Five      Cinq   Cinco
```

See [API Documentation for IO](docs/api-io.md)



Contributing
------------

Contributions (issues ♥, pull requests ♥♥♥) are more than welcome! Feel free to
clone, fork, modify, extend, etc, as long as you respect the
[license terms](LICENSE.md).

See [contributing intructions](docs/contributing.md) for details.


Licensing
---------

This project is released under [ISC License](LICENSE.d) license. If this license
does not fit your requirement for whatever reason, but you would be interested
in using the work (as defined below) under another license, please contact
[authors](docs/authors.md).