Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit f908a56

Browse files
committed
Add generic Argument attribute
1 parent a9f999c commit f908a56

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

src/Commands/Attributes/Argument.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
namespace WendellAdriel\Virtue\Commands\Attributes;
66

7+
use Attribute;
78
use Closure;
89

9-
abstract class Argument
10+
#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
11+
class Argument
1012
{
1113
/**
1214
* @param string|int|bool|array<mixed>|float|null $default

src/Commands/Concerns/Virtue.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,15 @@ trait Virtue
2626
public function getArguments(): array
2727
{
2828
$arguments = [];
29-
$requiredArguments = $this->buildArgumentsList(RequiredArgument::class);
29+
$generalArguments = $this->buildArgumentsList(Argument::class);
30+
31+
$requiredArguments = $this->buildArgumentsList(RequiredArgument::class)
32+
->merge($generalArguments->where('mode', InputArgument::REQUIRED));
33+
3034
[$arrayArguments, $nonArrayArguments] = $requiredArguments->partition(fn (array $argument) => $argument['mode'] > InputArgument::REQUIRED);
31-
$optionalArguments = $this->buildArgumentsList(OptionalArgument::class);
35+
36+
$optionalArguments = $this->buildArgumentsList(OptionalArgument::class)
37+
->merge($generalArguments->filter(fn (array $argument) => $argument['mode'] === InputArgument::OPTIONAL || $argument['mode'] === InputArgument::IS_ARRAY));
3238

3339
foreach ($nonArrayArguments as $argument) {
3440
$arguments[] = $argument;

tests/Datasets/TestCommand.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Tests\Datasets;
66

77
use Illuminate\Console\Command;
8+
use WendellAdriel\Virtue\Commands\Attributes\Argument;
89
use WendellAdriel\Virtue\Commands\Attributes\FlagOption;
910
use WendellAdriel\Virtue\Commands\Attributes\OptionalArgument;
1011
use WendellAdriel\Virtue\Commands\Attributes\RequiredArgument;
@@ -13,6 +14,8 @@
1314

1415
#[RequiredArgument(name: 'name')]
1516
#[OptionalArgument(name: 'age', default: 18)]
17+
#[Argument(name: 'optional', required: false, description: 'Optional parameter')]
18+
#[Argument(name: 'required')]
1619
#[FlagOption(name: 'negative', shortcut: 'm', negatable: true)]
1720
#[ValueOption(name: 'year', description: 'The year')]
1821
#[ValueOption(name: 'scores', array: true, default: [1, 2, 3])]

tests/Feature/CommandAttributesTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
$arguments = Collection::make($command->getArguments())->keyBy('name');
1111
$options = Collection::make($command->getOptions())->keyBy('name');
1212

13-
expect($arguments)->toHaveCount(2)
13+
expect($arguments)->toHaveCount(4)
1414
->and($arguments->get('name'))->toBeArray()
15+
->and($arguments->get('required'))->toBeArray()
16+
->and($arguments->get('optional'))->toBeArray()
17+
->and($arguments->get('optional')['description'])->toBe('Optional parameter')
1518
->and($arguments->get('age'))->toBeArray()
1619
->and($arguments->get('age')['default'])->toBe(18)
1720
->and($options)->toHaveCount(3)

0 commit comments

Comments
 (0)