Skip to content

Commit

Permalink
Merge pull request #3 from ellemenno/v2.0.1
Browse files Browse the repository at this point in the history
v2.0.1
  • Loading branch information
pixeldroid authored Dec 31, 2016
2 parents 55093bf + 50fab03 commit e2bfc3b
Show file tree
Hide file tree
Showing 9 changed files with 153 additions and 89 deletions.
23 changes: 15 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
optionparser-ls
===============

a simple option parser for Loom commandline apps
a simple option parser for [Loom][loom-sdk] commandline apps

- [installation](#installation)
- [usage](#usage)
- [building](#building)
- [contributing](#contributing)


## installation

Download the library into its matching sdk folder:

$ curl -L -o ~/.loom/sdks/sprint34/libs/OptionParser.loomlib \
https://github.com/pixeldroid/optionparser-ls/releases/download/v2.0.0/OptionParser-sprint34.loomlib
https://github.com/pixeldroid/optionparser-ls/releases/download/v2.0.1/OptionParser-sprint34.loomlib

To uninstall, simply delete the file:

Expand All @@ -20,7 +25,7 @@ To uninstall, simply delete the file:

0. declare a reference to the OptionParser loomlib in your `.build` file:
*
```
```ls
"references": [
"System",
"OptionParser"
Expand All @@ -47,14 +52,14 @@ you can compile and run the demo from the command line:
or use Rake:
$ rake demo:cli['--optionA arg1 arg2 -b']
$ rake cli['--optionA arg1 arg2 -b']
## working from source
## building
> first install [loomtasks][loomtasks]
first, install [loomtasks][loomtasks] and the [spec-ls library][spec-ls]
### compiling
### compiling from source
$ rake lib:install
Expand All @@ -72,6 +77,8 @@ this will build the OptionParser library, install it in the currently configured
Pull requests are welcome!
[loomtasks]: https://github.com/pixeldroid/loomtasks "loomtasks"
[loom-sdk]: https://github.com/LoomSDK/LoomSDK "a native mobile app and game framework"
[loomtasks]: https://github.com/pixeldroid/loomtasks "Rake tasks for working with loomlibs"
[OptionParserDemo.build]: ./test/src/OptionParserDemo.build "build file for the demo"
[OptionParserDemo.ls]: ./test/src/OptionParserDemo.ls "source file for the demo"
[spec-ls]: https://github.com/pixeldroid/spec-ls "a simple spec framework for Loom"
4 changes: 0 additions & 4 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@

LIB_NAME = 'OptionParser'
LIB_VERSION_FILE = File.join('lib', 'src', 'pixeldroid', 'cli', 'OptionParser.ls')

begin
load(File.join(ENV['HOME'], '.loom', 'tasks', 'loomlib.rake'))
load(File.join(ENV['HOME'], '.loom', 'tasks', 'loomlib_demo.rake'))
rescue LoadError
abort([
'error: missing loomlib.rake',
' please install loomtasks before running this Rakefile:',
' https://github.com/pixeldroid/loomtasks/',
].join("\n"))
end

Rake::Task['demo:gui'].clear # no gui demo for this project
3 changes: 3 additions & 0 deletions cli/loom.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"sdk_version": "sprint34"
}
19 changes: 19 additions & 0 deletions cli/src/OptionParserDemoCLI.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "OptionParserDemoCLI",
"version": "1.0",
"outputDir": "bin",
"references": [
"System",
"OptionParser"
],
"modules": [
{
"name": "OptionParserDemoCLI",
"version": "1.0",
"sourcePath": [
"demo"
]
}
],
"executable": true
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package
import system.application.ConsoleApplication;
import pixeldroid.cli.OptionParser;

public class OptionParserDemo extends ConsoleApplication
public class OptionParserDemoCLI extends ConsoleApplication
{
override public function run():void
{
Expand Down
6 changes: 3 additions & 3 deletions lib/src/OptionParser.build
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
{
"name": "OptionParser",
"version": "2.0.0",
"version": "2.0.1",
"outputDir": "./build",
"references": [
"System"
],
"modules": [
{
"name": "OptionParser",
"version": "2.0.0",
"version": "2.0.1",
"sourcePath": [
"."
]
}
]
}
}
2 changes: 1 addition & 1 deletion lib/src/pixeldroid/cli/OptionParser.ls
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ package pixeldroid.cli

public class OptionParser
{
public static const version:String = '2.0.0';
public static const version:String = '2.0.1';

private var options:Dictionary.<String, Option>;
private var numArgs:Number;
Expand Down
17 changes: 0 additions & 17 deletions test/src/OptionParserDemo.build

This file was deleted.

166 changes: 111 additions & 55 deletions test/src/spec/OptionParserSpec.ls
Original file line number Diff line number Diff line change
Expand Up @@ -5,70 +5,126 @@ package

import pixeldroid.cli.OptionParser;


public static class OptionParserSpec
{
private static const it:Thing = Spec.describe('OptionParser');
private static const args:Vector.<String> = ['--option-one', 'v1', 'v2', 'v3', '-b', '-c', 'value for c', '--option-four'];
private static const argProvider1 = new ArgProviderMock(args);
private static const argProvider2 = new ArgProviderMock(['not-an-option']);


public static function describe():void
{
var it:Thing = Spec.describe('OptionParser');
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.should('be versioned', be_versioned);
it.should('find all the valid options, arguments, and flags', find_valid_input);
it.should('ignore leading arguments that do not start with a hyphen', ignore_leading_args);
it.should('parse short-form options', parse_short_form);
it.should('parse long-form options', parse_long_form);
it.should('assume options with no values are flags set true', assume_flags_true);
it.should('parse the option value as a tuple when multiple args are provided', create_tuples_many_args);
it.should('parse the option value as a tuple when just a single arg is provided', create_tuples_one_arg);
it.should('parse the option value as a tuple when no args are provided', create_tuples_no_args);
it.should('return a default option when a user provided one cannot be retrieved', return_defaults);
it.should('provide a summary string of all options parsed', provide_summary_string);
}

private static function be_versioned():void
{
it.expects(OptionParser.version).toPatternMatch('(%d+).(%d+).(%d+)', 3);
}

private static function find_valid_input():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.argCount).toEqual(args.length);
}

private static function ignore_leading_args():void
{
var noOptions:OptionParser = new OptionParser(argProvider2);
noOptions.parse();

it.expects(noOptions.hasOption('not-an-option')).toBeFalsey();
it.expects(noOptions.toString()).toBeEmpty();
}

private static function parse_short_form():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('b').hasValue).toBeTruthy();
it.expects(options.getOption('c').hasValue).toBeTruthy();
}

private static function parse_long_form():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('option-one').hasValue).toBeTruthy();
it.expects(options.getOption('option-four').hasValue).toBeTruthy();
}

private static function assume_flags_true():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('b').isSet).toBeTruthy();
it.expects(options.getOption('option-four').isSet).toBeTruthy();
}

private static function create_tuples_many_args():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('option-one').value).toBeA(Vector);
it.expects(options.getOption('option-one').value.length).toEqual(3);
}

var args:Vector.<String> = ['--option-one', 'v1', 'v2', 'v3', '-b', '-c', 'value for c', '--option-four'];
var argProvider1 = new ArgProviderMock(args);
var argProvider2 = new ArgProviderMock(['not-an-option']);
private static function create_tuples_one_arg():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('c').value).toBeA(Vector);
it.expects(options.getOption('c').value.length).toEqual(1);
}

private static function create_tuples_no_args():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('b').value).toBeA(Vector);
it.expects(options.getOption('b').value.length).toEqual(1);
it.expects(options.getOption('option-four').value).toBeA(Vector);
it.expects(options.getOption('option-four').value.length).toEqual(1);
}

private static function return_defaults():void
{
var xDefault:Vector.<String> = ['x-default'];
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.expects(options.getOption('x', '', xDefault).value).toEqual(xDefault);
}

private static function provide_summary_string():void
{
var options:OptionParser = new OptionParser(argProvider1);
options.parse();

it.should('find all the valid options, arguments, and flags', function() {
it.expects(options.argCount).toEqual(args.length);
});

it.should('ignore leading options that do not start with a hyphen', function() {
var noOptions:OptionParser = new OptionParser(argProvider2);
noOptions.parse();
it.expects(noOptions.hasOption('not-an-option')).toBeFalsey();
it.expects(noOptions.toString()).toBeEmpty();
});

it.should('parse short-form options', function() {
it.expects(options.getOption('b').hasValue).toBeTruthy();
it.expects(options.getOption('c').hasValue).toBeTruthy();
});

it.should('parse long-form options', function() {
it.expects(options.getOption('option-one').hasValue).toBeTruthy();
it.expects(options.getOption('option-four').hasValue).toBeTruthy();
});

it.should('assume options with no values are flags set true', function() {
it.expects(options.getOption('b').isSet).toBeTruthy();
it.expects(options.getOption('option-four').isSet).toBeTruthy();
});

it.should('parse the option value as a tuple when multiple args are provided', function() {
it.expects(options.getOption('option-one').value).toBeA(Vector);
it.expects(options.getOption('option-one').value.length).toEqual(3);
});

it.should('parse the option value as a tuple when just a single arg is provided', function() {
it.expects(options.getOption('c').value).toBeA(Vector);
it.expects(options.getOption('c').value.length).toEqual(1);
});

it.should('parse the option value as a tuple when no args are provided', function() {
it.expects(options.getOption('b').value).toBeA(Vector);
it.expects(options.getOption('b').value.length).toEqual(1);
it.expects(options.getOption('option-four').value).toBeA(Vector);
it.expects(options.getOption('option-four').value.length).toEqual(1);
});

it.should('return a default option when a user provided one cannot be retrieved', function() {
var xDefault:Vector.<String> = ['x-default'];
it.expects(options.getOption('x', '', xDefault).value).toEqual(xDefault);
});

it.should('provide a summary string of all options parsed', function() {
it.expects(options.toString()).toEqual('-b (true)\n--option-one (v1,v2,v3)\n-c (value for c)\n--option-four (true)\n');
});
it.expects(options.toString()).toEqual('-b (true)\n--option-one (v1,v2,v3)\n-c (value for c)\n--option-four (true)\n');
}
}

Expand Down

0 comments on commit e2bfc3b

Please sign in to comment.