diff --git a/Processor.php b/Processor.php index 6dc208f..919a01a 100644 --- a/Processor.php +++ b/Processor.php @@ -104,7 +104,7 @@ private function processParams(array $config, array $expectedParams, array $actu // Add the params coming from the environment values $actualParams = array_replace($actualParams, $this->getEnvValues($envMap)); - return $this->getParams($expectedParams, $actualParams); + return $this->getParams($config, $expectedParams, $actualParams); } private function getEnvValues(array $envMap) @@ -137,10 +137,14 @@ private function processRenamedValues(array $renameMap, array $actualParams) return $actualParams; } - private function getParams(array $expectedParams, array $actualParams) + private function getParams(array $config, array $expectedParams, array $actualParams) { - // Simply use the expectedParams value as default for the missing params. if (!$this->io->isInteractive()) { + if (!empty($config['exception-if-missing']) && $missingParams = array_diff_key($expectedParams, $actualParams)) { + // Throw exception in non-interactive mode if some params are missing + throw new \RuntimeException(sprintf("Some parameters are missing: %s. Please fill them.", implode(", ", array_keys($missingParams)))); + } + // Simply use the expectedParams value as default for the missing params return array_replace($expectedParams, $actualParams); } diff --git a/README.md b/README.md index 0f42600..c534d32 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,21 @@ will be used for missing parameters. your parameters.yml file so handle with care. If you want to give format and comments to your parameter's file you should do it on your dist version. +### Throwing exception if some parameters are missing in non-interactive mode + +You can also force the script handler to throw an exception when some parameters +are missing in non-interactive mode by using `exception-if-missing` param in the configuration: + +```json +{ + "extra": { + "incenteev-parameters": { + "exception-if-missing": true + } + } +} +``` + ### Keeping outdated parameters Warning: This script removes outdated params from ``parameters.yml`` which are not in ``parameters.yml.dist`` diff --git a/Tests/ProcessorTest.php b/Tests/ProcessorTest.php index 30082ba..34bdc61 100644 --- a/Tests/ProcessorTest.php +++ b/Tests/ProcessorTest.php @@ -115,7 +115,9 @@ public function testParameterHandling($testCaseName) $this->processor->processFile($testCase['config']); - $this->assertFileEquals($dataDir.'/expected.yml', $workingDir.'/'.$testCase['config']['file'], $testCase['title']); + if (file_exists($expected = $dataDir.'/expected.yml')) { + $this->assertFileEquals($expected, $workingDir.'/'.$testCase['config']['file'], $testCase['title']); + } } private function initializeTestCase(array $testCase, $dataDir, $workingDir) @@ -147,6 +149,11 @@ private function setInteractionExpectations(array $testCase) $this->io->isInteractive()->willReturn($testCase['interactive']); if (!$testCase['interactive']) { + if (!empty($testCase['config']['exception-if-missing']) && !empty($testCase['missing_params'])) { + $this->setExpectedException( + 'RuntimeException', + "Some parameters are missing: ".implode(", ", $testCase['missing_params']).". Please fill them."); + } return; } diff --git a/Tests/fixtures/testcases/exception_if_missing/dist.yml b/Tests/fixtures/testcases/exception_if_missing/dist.yml new file mode 100644 index 0000000..9fc4074 --- /dev/null +++ b/Tests/fixtures/testcases/exception_if_missing/dist.yml @@ -0,0 +1,4 @@ +parameters: + foo: bar + another: test + boolean: true \ No newline at end of file diff --git a/Tests/fixtures/testcases/exception_if_missing/existing.yml b/Tests/fixtures/testcases/exception_if_missing/existing.yml new file mode 100644 index 0000000..c31530c --- /dev/null +++ b/Tests/fixtures/testcases/exception_if_missing/existing.yml @@ -0,0 +1,3 @@ +# This file is auto-generated during the composer install +parameters: + foo: existing_foo diff --git a/Tests/fixtures/testcases/exception_if_missing/setup.yml b/Tests/fixtures/testcases/exception_if_missing/setup.yml new file mode 100644 index 0000000..0ff1331 --- /dev/null +++ b/Tests/fixtures/testcases/exception_if_missing/setup.yml @@ -0,0 +1,6 @@ +title: Missing keys involves exception thrown in non-interaction mode + +config: + exception-if-missing: true + +missing_params: ['another', 'boolean'] \ No newline at end of file diff --git a/Tests/fixtures/testcases/no_exception_if_no_missing/dist.yml b/Tests/fixtures/testcases/no_exception_if_no_missing/dist.yml new file mode 100644 index 0000000..9fc4074 --- /dev/null +++ b/Tests/fixtures/testcases/no_exception_if_no_missing/dist.yml @@ -0,0 +1,4 @@ +parameters: + foo: bar + another: test + boolean: true \ No newline at end of file diff --git a/Tests/fixtures/testcases/no_exception_if_no_missing/existing.yml b/Tests/fixtures/testcases/no_exception_if_no_missing/existing.yml new file mode 100644 index 0000000..63ceec3 --- /dev/null +++ b/Tests/fixtures/testcases/no_exception_if_no_missing/existing.yml @@ -0,0 +1,5 @@ +# This file is auto-generated during the composer install +parameters: + foo: existing_foo + another: existing_test + boolean: false diff --git a/Tests/fixtures/testcases/no_exception_if_no_missing/expected.yml b/Tests/fixtures/testcases/no_exception_if_no_missing/expected.yml new file mode 100644 index 0000000..63ceec3 --- /dev/null +++ b/Tests/fixtures/testcases/no_exception_if_no_missing/expected.yml @@ -0,0 +1,5 @@ +# This file is auto-generated during the composer install +parameters: + foo: existing_foo + another: existing_test + boolean: false diff --git a/Tests/fixtures/testcases/no_exception_if_no_missing/setup.yml b/Tests/fixtures/testcases/no_exception_if_no_missing/setup.yml new file mode 100644 index 0000000..f6cd4cd --- /dev/null +++ b/Tests/fixtures/testcases/no_exception_if_no_missing/setup.yml @@ -0,0 +1,4 @@ +title: No exception is thrown in non-interaction mode if all the required params are provided + +config: + exception-if-missing: true \ No newline at end of file