From a4a8d5e351b30d38ba8785514254158cc7963987 Mon Sep 17 00:00:00 2001 From: Alannah Kearney Date: Fri, 24 May 2019 17:20:50 +1000 Subject: [PATCH] Updated README, CHANGELOG, example code, and composer.json for 1.1.0 --- CHANGELOG.md | 17 +++++- README.md | 6 +-- composer.json | 2 +- example/example.php | 124 ++++++++++++++++++++++++++------------------ 4 files changed, 93 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98c1193..d1fac78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ This project adheres to [Semantic Versioning](http://semver.org/). **View all [Unreleased][] changes here** +## [1.1.0][] +#### Added +- Expanded input types to include `Flag`, `IncrementingFlag`, and `LongOption`. +- Added `InputTypeFactory` to help with loading input type classes + +#### Changed +- Updated to work with more than just `Argument` and `Option` input types. Makes use of `InputTypeFactory` to allow addition of new types as needed. + +## [1.0.2][] +#### Changed +- Updated example to reflect changes to `manpage()` function in `pointybeard/helpers-functions-cli` package +- Refactoring and improvemnts to `Argument::__toString()` and `Option::__toString()` + ## [1.0.2][] #### Fixed - Fixed `InputCollection::getArgumentsByIndex()` so it returns NULL if the index does not exist instead of throwing an E_NOTICE message @@ -17,6 +30,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). #### Added - Initial release -[Unreleased]: https://github.com/pointybeard/helpers-functions-cli/compare/1.0.2...integration +[Unreleased]: https://github.com/pointybeard/helpers-functions-cli/compare/1.1.0...integration +[1.1.0]: https://github.com/pointybeard/helpers-functions-cli/compare/1.0.3...1.1.0 +[1.0.3]: https://github.com/pointybeard/helpers-functions-cli/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/pointybeard/helpers-functions-cli/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/pointybeard/helpers-functions-cli/compare/1.0.0...1.0.1 diff --git a/README.md b/README.md index ee87be8..5a592d4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # PHP Helpers: Command-line Input and Input Type Handlers -- Version: v1.0.3 +- Version: v1.1.0 - Date: May 24 2019 - [Release notes](https://github.com/pointybeard/helpers-cli-input/blob/master/CHANGELOG.md) - [GitHub repository](https://github.com/pointybeard/helpers-cli-input) @@ -9,7 +9,7 @@ Collection of classes for handling argv (and other) input when calling command-l ## Installation -This library is installed via [Composer](http://getcomposer.org/). To install, use `composer require pointybeard/helpers-cli-input` or add `"pointybeard/helpers-cli-input": "~1.0"` to your `composer.json` file. +This library is installed via [Composer](http://getcomposer.org/). To install, use `composer require pointybeard/helpers-cli-input` or add `"pointybeard/helpers-cli-input": "~1.1"` to your `composer.json` file. And run composer to update your dependencies: @@ -26,7 +26,7 @@ To include all the [PHP Helpers](https://github.com/pointybeard/helpers) package Include this library in your PHP files with `use pointybeard\Helpers\Cli`. See example code in `example/example.php`. The example code can be run with the following command: - php -f example/example.php -- -vvv -d example/example.json import + php -f example/example.php -- -vvvs -d example/example.json import ## Support diff --git a/composer.json b/composer.json index a9f6972..b88f0d1 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "pointybeard/helpers-cli-input", - "version": "1.0.3", + "version": "1.1.0", "description": "Collection of classes for handling argv (and other) input when calling command-line scripts. Helps with parsing, collecting and validating arguments, options, and flags.", "homepage": "https://github.com/pointybeard/helpers-cli-input", "license": "MIT", diff --git a/example/example.php b/example/example.php index 6af92e1..f0b0002 100644 --- a/example/example.php +++ b/example/example.php @@ -9,47 +9,60 @@ use pointybeard\Helpers\Functions\Cli; // Define what we are expecting to get from the command line $collection = (new Input\InputCollection()) - ->append(new Input\Types\Argument( - 'action', - Input\AbstractInputType::FLAG_REQUIRED, - 'The name of the action to perform' - )) - ->append(new Input\Types\Option( - 'v', - null, - Input\AbstractInputType::FLAG_OPTIONAL | Input\AbstractInputType::FLAG_TYPE_INCREMENTING, - 'verbosity level. -v (errors only), -vv (warnings and errors), -vvv (everything).', - null, - 0 - )) - ->append(new Input\Types\Option( - 'd', - 'data', - Input\AbstractInputType::FLAG_OPTIONAL | Input\AbstractInputType::FLAG_VALUE_REQUIRED, - 'Path to the input JSON data', - function (Input\AbstractInputType $input, Input\AbstractInputHandler $context) { - // Make sure -d (--data) is a valid file that can be read - $file = $context->getOption('d'); + ->append( + Input\InputTypeFactory::build('Argument') + ->name('action') + ->flags(Input\AbstractInputType::FLAG_REQUIRED) + ->description('The name of the action to perform') + ) + ->append( + Input\InputTypeFactory::build('IncrementingFlag') + ->name('v') + ->flags(Input\AbstractInputType::FLAG_OPTIONAL | Input\AbstractInputType::FLAG_TYPE_INCREMENTING) + ->description('verbosity level. -v (errors only), -vv (warnings and errors), -vvv (everything).') + ->validator(new Input\Validator( + function (Input\AbstractInputType $input, Input\AbstractInputHandler $context) { + // Make sure verbosity level never goes above 3 + return min(3, (int)$context->find('v')); + } + )) + ) + ->append( + Input\InputTypeFactory::build('LongOption') + ->name('data') + ->short('d') + ->flags(Input\AbstractInputType::FLAG_OPTIONAL | Input\AbstractInputType::FLAG_VALUE_REQUIRED) + ->description('Path to the input JSON data') + ->validator(new Input\Validator( + function (Input\AbstractInputType $input, Input\AbstractInputHandler $context) { + // Make sure -d (--data) is a valid file that can be read + $file = $context->find('data'); - if (!is_readable($file)) { - throw new \Exception('The file specified via option -d (--data) does not exist or is not readable.'); - } + if (!is_readable($file)) { + throw new \Exception('The file specified via option --data does not exist or is not readable.'); + } - // Now make sure it is valid JSON - try { - $json = json_decode(file_get_contents($file), false, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $ex) { - throw new \Exception(sprintf('The file specified via option -d (--data) does not appear to be a valid JSON ddocument. Returned: %s: %s', $ex->getCode(), $ex->getMessage())); - } + // Now make sure it is valid JSON + try { + $json = json_decode(file_get_contents($file), false, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $ex) { + throw new \Exception(sprintf('The file specified via option --data does not appear to be a valid JSON ddocument. Returned: %s: %s', $ex->getCode(), $ex->getMessage())); + } - return $json; - } - )) + return $json; + } + )) + ) ; // Get the supplied input. Passing the collection will make the handler bind values // and validate the input according to our collection -$argv = Input\InputHandlerFactory::build('Argv', $collection); +try{ + $argv = Input\InputHandlerFactory::build('Argv', $collection); +} catch(\Exception $ex) { + echo "Error when attempting to bind values to collection. Returned: " . $ex->getMessage() . PHP_EOL; + exit; +} // Display the manual in green text echo Cli\manpage( @@ -77,24 +90,33 @@ echo Cli\manpage( // -d, --data=VALUE Path to the input JSON data // // Examples: -// php -f example/example.php -- -vvv -d example/example.json import +// php -f example/example.php -- -vvvs -d example/example.json import -var_dump($argv->getArgument('action')); -// string(6) "import" +try{ -var_dump($argv->getOption('v')); -//int(3) + var_dump($argv->find('action')); + // string(6) "import" -var_dump($argv->getOption('s')); -//bool(true) + var_dump($argv->find('v')); + //int(3) -var_dump($argv->getOption('d')); -// class stdClass#11 (1) { -// public $fruit => -// array(2) { -// [0] => -// string(5) "apple" -// [1] => -// string(6) "banana" -// } -// } + var_dump($argv->find('s')); + //bool(true) + + var_dump($argv->find('data')); + // class stdClass#11 (1) { + // public $fruit => + // array(2) { + // [0] => + // string(5) "apple" + // [1] => + // string(6) "banana" + // } + // } + + var_dump($argv->find('nope-doesnt-exist')); + +} catch(\Exception $ex) { + echo "Error: " . $ex->getMessage() . PHP_EOL; +} +//Error trying to access input. Returned: Input nope-doesnt-exist could not be found.