Skip to content

Commit

Permalink
Add hasArgument and getArgument
Browse files Browse the repository at this point in the history
Allow positional arguments to be accessed by name
  • Loading branch information
markstory committed Sep 21, 2017
1 parent a56daa0 commit 6a7256b
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 6 deletions.
45 changes: 43 additions & 2 deletions src/Console/Arguments.php
Expand Up @@ -20,6 +20,13 @@
*/
class Arguments
{
/**
* Positional argument name map
*
* @var array
*/
protected $argNames;

/**
* Positional arguments.
*
Expand All @@ -39,11 +46,13 @@ class Arguments
*
* @param string[] $args Positional arguments
* @param array $options Named arguments
* @param array $argNames Map of argument names and their indexes.
*/
public function __construct(array $args, array $options)
public function __construct(array $args, array $options, array $argNames)
{
$this->args = $args;
$this->options = $options;
$this->argNames = $argNames;
}

/**
Expand All @@ -64,7 +73,7 @@ public function getArguments()
*/
public function getArgumentAt($index)
{
if (isset($this->args[$index])) {
if ($this->hasArgumentAt($index)) {
return $this->args[$index];
}

Expand All @@ -81,4 +90,36 @@ public function hasArgumentAt($index)
{
return isset($this->args[$index]);
}

/**
* Check if a positional argument exists by name
*
* @param string $name The argument name to check.
* @return bool
*/
public function hasArgument($name)
{
if (!isset($this->argNames[$name])) {
return false;
}
$index = $this->argNames[$name];

return isset($this->args[$index]);
}

/**
* Check if a positional argument exists by name
*
* @param string $name The argument name to check.
* @return string|null
*/
public function getArgument($name)
{
if (!isset($this->argNames[$name])) {
return null;
}
$index = $this->argNames[$name];

return $this->args[$index];
}
}
41 changes: 37 additions & 4 deletions tests/TestCase/Console/ArgumentsTest.php
Expand Up @@ -12,7 +12,6 @@
* @since 3.6.0
* @license https://opensource.org/licenses/mit-license.php MIT License
*/

namespace Cake\Test\TestSuite\Console;

use Cake\Console\Arguments;
Expand All @@ -31,7 +30,7 @@ class ArgumentsTest extends TestCase
public function testGetArguments()
{
$values = ['big', 'brown', 'bear'];
$args = new Arguments($values, []);
$args = new Arguments($values, [], []);
$this->assertSame($values, $args->getArguments());
}

Expand All @@ -43,7 +42,7 @@ public function testGetArguments()
public function testGetArgumentAt()
{
$values = ['big', 'brown', 'bear'];
$args = new Arguments($values, []);
$args = new Arguments($values, [], []);
$this->assertSame($values[0], $args->getArgumentAt(0));
$this->assertSame($values[1], $args->getArgumentAt(1));
$this->assertNull($args->getArgumentAt(3));
Expand All @@ -57,9 +56,43 @@ public function testGetArgumentAt()
public function testHasArgumentAt()
{
$values = ['big', 'brown', 'bear'];
$args = new Arguments($values, []);
$args = new Arguments($values, [], []);
$this->assertTrue($args->hasArgumentAt(0));
$this->assertTrue($args->hasArgumentAt(1));
$this->assertFalse($args->hasArgumentAt(3));
$this->assertFalse($args->hasArgumentAt(-1));
}

/**
* check arguments by name
*
* @return void
*/
public function testHasArgument()
{
$values = ['big', 'brown', 'bear'];
$names = ['size' => 0, 'color' => 1, 'species' => 2, 'odd' => 3];
$args = new Arguments($values, [], $names);
$this->assertTrue($args->hasArgument('size'));
$this->assertTrue($args->hasArgument('color'));
$this->assertFalse($args->hasArgument('hair'));
$this->assertFalse($args->hasArgument('Hair'), 'casing matters');
$this->assertFalse($args->hasArgument('odd'));
}

/**
* get arguments by name
*
* @return void
*/
public function testGetArgument()
{
$values = ['big', 'brown', 'bear'];
$names = ['size' => 0, 'color' => 1, 'species' => 2, 'odd' => 3];
$args = new Arguments($values, [], $names);
$this->assertSame($values[0], $args->getArgument('size'));
$this->assertSame($values[1], $args->getArgument('color'));
$this->assertNull($args->getArgument('Color'));
$this->assertNull($args->getArgument('hair'));
}
}

0 comments on commit 6a7256b

Please sign in to comment.