Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
CRAP | |
90.67% |
68 / 75 |
Configurator | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
15.18 | |
90.67% |
68 / 75 |
getDefaultGroupName() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getDefaultSettingGroupName() | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
run() | |
0.00% |
0 / 1 |
12.14 | |
90.14% |
64 / 71 |
<?php | |
namespace Environaut\Checks; | |
use Environaut\Checks\Check; | |
/** | |
* Basic check to ask the user for environment configuration settings. | |
* | |
* Supported parameters are: | |
* - "introduction": text to display before this check | |
* - "question": text to ask user for a value | |
* - "setting": name of setting variable | |
* - "setting_group": group the configured setting belongs to (for export; defaults to "config") | |
* - "choices": array of autocomplete values or choices for selection (depending on check configuration) | |
* - "default": default value if none is given by the user | |
* - "hidden": hidden question to user (e,g. for credentials) | |
* - "allow_fallback": allow fallback to visible input if hidden input does not work | |
* - "validator": class/method to use for validation of value - must return valid value or throw helpful exception | |
* - "max_attempts": maximum attempts if validator is specified | |
* - "confirm": simple yes/no confirmation question (only y/n are accepted answers) | |
* - "select": select value from the list of choices | |
*/ | |
class Configurator extends Check | |
{ | |
/** | |
* Default group of settings that this check stores in the result. | |
*/ | |
const DEFAULT_SETTING_GROUP_NAME = 'config'; | |
/** | |
* Default group name used in messages of the report. | |
* By default also used as default setting group name if not customized. | |
*/ | |
const DEFAULT_CUSTOM_GROUP_NAME = 'Configuration'; | |
/** | |
* Returns the default group name this check uses when none is specified. | |
* | |
* @return string default group name of the check | |
*/ | |
public function getDefaultGroupName() | |
{ | |
return self::DEFAULT_CUSTOM_GROUP_NAME; | |
} | |
/** | |
* Returns the default group name this check uses for settings when none is specified. | |
* | |
* @return string default group name of settings of this check | |
*/ | |
public function getDefaultSettingGroupName() | |
{ | |
if ($this->group !== self::DEFAULT_CUSTOM_GROUP_NAME) { | |
return $this->group; | |
} | |
return self::DEFAULT_SETTING_GROUP_NAME; | |
} | |
/** | |
* Asks the user a question and sets the answer as a setting on the result. | |
* | |
* @return boolean true if configuration could be added to the result; false otherwise | |
* | |
* @throws \InvalidArgumentException on setup errors like "choices" can't be interpreted | |
* @throws \RuntimeException in case "allow_fallback" is deactivated but the response can't be "hidden" | |
* @throws \RuntimeException if there is no data to read in the input stream | |
* @throws \Exception when the maximum number of attempts has been reached and no valid response has been given | |
*/ | |
public function run() | |
{ | |
$dialog = $this->getDialogHelper(); | |
$output = $this->getOutputStream(); | |
$output->writeln(PHP_EOL); // to get some margin to the progress bar | |
$introduction = $this->parameters->get('introduction', false); | |
if (false !== $introduction) { | |
$output->writeln($introduction); | |
$output->writeln(''); | |
} | |
$name = $this->parameters->get('setting', $this->getName()); | |
$setting_group = $this->parameters->get('setting_group'); | |
$choices = $this->parameters->get('choices', array()); | |
$default = $this->parameters->get('default', null); | |
$validator = $this->parameters->get('validator', false); | |
$hidden = (bool) $this->parameters->get('hidden', false); | |
$allow_fallback = (bool) $this->parameters->get('allow_fallback', false); | |
$max_attempts = $this->parameters->get('max_attempts', false); | |
$confirm = (bool) $this->parameters->get('confirm', false); | |
$select = (bool) $this->parameters->get('select', false); | |
if ($this->cache->has($name, $setting_group)) { | |
$cached_setting = $this->cache->get($name, $setting_group); | |
$this->addInfo( | |
"Setting [" . $cached_setting->getGroup() . "][$name] already configured. Using " . | |
'value: ' . var_export($cached_setting->getValue(), true) | |
); | |
// add cached value directly as cachable setting to the result of this check | |
$this->result->addSetting($cached_setting); | |
return true; | |
} | |
$question = '<question>' . $this->parameters->get('question', '"setting_question" is not set'); | |
// a simple yes(no confirmation dialog | |
if ($confirm) { | |
$default = (bool) ($default === null ? true : $default); | |
$default_text = ($default ? 'y' : 'n'); | |
$question .= "</question> (Type [y/n/<return>], default=$default_text): "; | |
$value = $dialog->askConfirmation($output, $question, $default); | |
$default_text = ($default ? 'enabled' : 'disabled'); | |
$this->addInfo($name . ' is ' . $default_text); | |
$this->addCachableSetting($name, $value, $setting_group); | |
return true; | |
} | |
// add default value to question if specified | |
if (null !== $default) { | |
$question .= "</question> (Default: $default)"; | |
} else { | |
$question .= '</question>'; | |
} | |
$question .= ': '; | |
// selection dialog to choose values from a list of choices | |
if ($select) { | |
$value = $dialog->select($output, $question, $choices, $default, $max_attempts); | |
$this->addCachableSetting($name, $choices[$value], $setting_group); | |
$this->addInfo('Selected value for "' . $name . '" is "' . $choices[$value] . '".'); | |
return true; | |
} | |
if (false !== $validator) { // use value validation? | |
if ($hidden) { | |
$value = $dialog->askHiddenResponseAndValidate( | |
$output, | |
$question, | |
$validator, | |
$max_attempts, | |
$allow_fallback | |
); | |
} else { | |
$value = $dialog->askAndValidate( | |
$output, | |
$question, | |
$validator, | |
$max_attempts, | |
$default, | |
$choices | |
); | |
} | |
} else { // do not use value validation | |
if ($hidden) { | |
$value = $dialog->askHiddenResponse($output, $question, $allow_fallback); | |
} else { | |
$value = $dialog->ask($output, $question, $default, $choices); | |
} | |
} | |
$this->addInfo('Successfully configured "' . $name . '".'); | |
$this->addCachableSetting($name, $value, $setting_group); | |
$output->writeln(''); | |
return true; | |
} | |
} |