Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow arguments and options to be passed through to workflow scripts #24

Merged
merged 3 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions docs/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,58 @@ pup workflow my-workflow
pup do my-workflow
```

### Pass additional arguments or options to a workflow

You can pass through additional arguments and options to your workflow script.

Example `test-script.sh`:
```bash
#!/usr/bin/env bash

# Loop through all the arguments
while [[ "$#" -gt 0 ]]; do
case $1 in
--*=*) # Option in --option=value format
option="${1%%=*}" # Extract the option
value="${1#*=}" # Extract the value
echo "Option: $option, Value: $value"
shift
;;
--*) # Option in --option format (expecting a separate value)
option=$1
shift
if [[ "$1" && ! "$1" =~ ^-- ]]; then
value=$1
echo "Option: $option, Value: $value"
shift
else
echo "Option: $option, No value provided"
fi
;;
*) # Regular argument
echo "Argument: $1"
shift
;;
esac
done
```

Example in `.puprc`:
```json
{
"workflows": {
"my-test-workflow": [
"./test-script.sh"
]
}
}
```

Pass through arguments and options to `test-script.sh`:
```bash
pup workflow my-test-workflow -- arg1 arg2 otherArg --option-one=test1 --option-two=test2
```

## Pseudo-workflows

The `build` and `build_dev` properties within your `.puprc` file are also callable via the `workflow` command.
Expand Down
26 changes: 19 additions & 7 deletions src/Commands/Workflow.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ class Workflow extends Command {
*/
protected function configure() {
$this->setName( 'workflow' )
->setAliases( [ 'do' ] )
->addArgument( 'workflow', InputArgument::REQUIRED, 'The workflow you would like to run.' )
->addOption( 'root', null, InputOption::VALUE_REQUIRED, 'Set the root directory for running commands.' )
->setDescription( 'Run a command workflow.' )
->setHelp( 'Run a command workflow.' );
->setAliases( [ 'do' ] )
->addArgument( 'workflow', InputArgument::REQUIRED, 'The workflow you would like to run.' )
->addArgument( 'extra_args', InputArgument::IS_ARRAY, 'Additional arguments to pass to the workflow.' )
->addOption( 'root', null, InputOption::VALUE_REQUIRED, 'Set the root directory for running commands.' )
->addOption( 'extra_options', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, 'Additional options to pass to the workflow.' )
->setDescription( 'Run a command workflow.' )
->setHelp( 'Run a command workflow.' );
}

/**
Expand All @@ -34,6 +36,8 @@ protected function execute( InputInterface $input, OutputInterface $output ) {
$config = App::getConfig();
$root = $input->getOption( 'root' );
$workflow_slug = $input->getArgument( 'workflow' );
$extra_args = $input->getArgument( 'extra_args' );
$extra_options = $input->getOption( 'extra_options' );
$io = $this->getIO();
$application = $this->getApplication();
if ( ! $application ) {
Expand Down Expand Up @@ -73,8 +77,16 @@ protected function execute( InputInterface $input, OutputInterface $output ) {
$bail_on_failure = false;
$step = substr( $step, 1 );
}
$io->section( "> <fg=cyan>{$step}</>" );
system( Env::set( $step ), $result );

// Add extra arguments and options to the command.
$extra_args_string = implode( ' ', array_map( 'escapeshellarg', $extra_args ) );
$extra_options_string = implode( ' ', array_map( static function ( $option ) {
return escapeshellarg( $option );
}, $extra_options ) );
$full_command = trim( "{$step} {$extra_args_string} {$extra_options_string}" );

$io->section( "> <fg=cyan>{$full_command}</>" );
system( Env::set( $full_command ), $result );
$io->newLine();

if ( $result ) {
Expand Down
30 changes: 30 additions & 0 deletions tests/_data/test-workflow-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash

# A test workflow run via the test suite

# Loop through all the arguments
while [[ "$#" -gt 0 ]]; do
case $1 in
--*=*) # Option in --option=value format
option="${1%%=*}" # Extract the option
value="${1#*=}" # Extract the value
echo "Option: $option, Value: $value"
shift
;;
--*) # Option in --option format (expecting a separate value)
option=$1
shift
if [[ "$1" && ! "$1" =~ ^-- ]]; then
value=$1
echo "Option: $option, Value: $value"
shift
else
echo "Option: $option, No value provided"
fi
;;
*) # Regular argument
echo "Argument: $1"
shift
;;
esac
done
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
Checking for TBDs...
--------------------

./src/Plugin.php
9: * @since TBD

./src/Thing/AnotherFile.php
5: _deprecated_file( __FILE__, 'TBD' );
9: * @since TBD
Expand All @@ -14,5 +11,8 @@ Checking for TBDs...
28: * @deprecated TBD
32: _deprecated_function( __METHOD__, 'TBD' );

./src/Plugin.php
9: * @since TBD


TBDs have been found!
23 changes: 23 additions & 0 deletions tests/cli/Commands/WorkflowCest.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,27 @@ public function it_should_run_build_with_custom_env_vars( CliTester $I ) {
$output = $I->grabShellOutput();
$this->assertMatchesStringSnapshot( $output );
}

/**
* @test
*/
public function it_should_pass_additional_arguments_and_options_to_workflow_script( CliTester $I ) {
$puprc = $this->get_puprc();
$puprc['workflows'] = [];
$puprc['workflows']['test-workflow'] = [];
$puprc['workflows']['test-workflow'][] = codecept_data_dir( 'test-workflow-script.sh' );
$this->write_puprc( $puprc );

chdir( codecept_data_dir( 'fake-project' ) );

$I->runShellCommand( "php {$this->pup} do test-workflow -- arg1 arg2 --option-one=one --option-two=two" );
$I->seeResultCodeIs( 0 );
$I->seeInShellOutput( 'Argument: arg1' );
$I->seeInShellOutput( 'Argument: arg2' );
$I->seeInShellOutput( 'Option: --option-one, Value: one' );
$I->seeInShellOutput( 'Option: --option-two, Value: two' );

$output = $I->grabShellOutput();
$this->assertMatchesStringSnapshot( $output );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Running test-workflow workflow steps...

> /var/www/html/wp-content/plugins/pup/tests/_data/test-workflow-script.sh 'arg1' 'arg2' '--option-one=one' '--option-two=two'
------------------------------------------------------------------------------------------------------------------------------

Argument: arg1
Argument: arg2
Option: --option-one, Value: one
Option: --option-two, Value: two

Workflow complete.
Loading