Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
88.89% |
48 / 54 |
ShellSettingsWriter | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
16.35 | |
88.89% |
48 / 54 |
format(IReport $report) | |
0.00% |
0 / 1 |
5.03 | |
90.00% |
27 / 30 |
|||
mapValue($value) | |
0.00% |
0 / 1 |
4.03 | |
87.50% |
7 / 8 |
|||
transformArrayValue(array $value) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
makeShellVariableName($setting_name, $group) | |
0.00% |
0 / 1 |
6.01 | |
93.33% |
14 / 15 |
<?php | |
namespace Environaut\Export\Formatter; | |
use Environaut\Report\IReport; | |
use Environaut\Export\Formatter\BaseFormatter; | |
use Environaut\Checks\ICheck; | |
/** | |
* Writes all or specific groups of settings as SHELL variables to a file. | |
* | |
* Supported parameters include: | |
* - "location": Path and filename to write (defaults to 'environaut-config.sh'). | |
* - "groups": Array of group names. Only settings with those groups are written. | |
* By default all settings regardless of their group are written. | |
* - "template": Content of file to write with placeholder '%settings$s' where | |
* settings will be put as shell variables (separated by newlines). | |
* - "use_group_as_prefix": Defines if the group name of the setting should be | |
* used as a prefix (defaults to false). | |
* - "capitalize_names": Whether to convert variable names to all uppercase or | |
* not (defaults to false). | |
*/ | |
class ShellSettingsWriter extends BaseFormatter | |
{ | |
/** | |
* Writes all or specific groups of settings as a shell file and | |
* returns a message with some information about that. | |
* | |
* @param IReport $report report to take results (and settings) from | |
* | |
* @return string messages for CLI output | |
*/ | |
public function format(IReport $report) | |
{ | |
$output = ''; | |
$params = $this->getParameters(); | |
$file = $params->get('location', 'environaut-config.sh'); | |
$groups = $params->get('groups'); | |
if (is_writable($file)) { | |
$output .= '<comment>Overwriting</comment> '; | |
} else { | |
$output .= 'Writing '; | |
} | |
if (empty($groups)) { | |
$output .= 'all groups '; | |
} else { | |
$output .= 'group(s) "' . implode(', ', $groups) . '" '; | |
} | |
$output .= 'to file "<comment>' . $file . '</comment>"...'; | |
$default_template = <<<EOT | |
%settings\$s | |
EOT; | |
$template = $params->get('template', $default_template); | |
$all_settings = $report->getSettingsAsArray($groups); | |
$grouped_settings = array(); | |
$content = ''; | |
foreach ($all_settings as $setting) { | |
$name = $this->makeShellVariableName($setting['name'], $setting['group']); | |
$value = $this->mapValue($setting['value']); | |
$content .= $name . "='" . $value ."'\n"; | |
} | |
$content = self::vksprintf($template, array('settings' => $content)); | |
$ok = file_put_contents($file, $content, LOCK_EX); | |
if ($ok !== false) { | |
$output .= '<info>ok</info>.'; | |
} else { | |
$output .= '<error>FAILED</error>.'; | |
} | |
return $output; | |
} | |
protected function mapValue($value) | |
{ | |
switch (gettype($value)) { | |
case "boolean": | |
return $value ? "1" : ""; | |
case "array": | |
return $this->transformArrayValue($value); | |
default: | |
return $value; | |
} | |
} | |
protected function transformArrayValue(array $value) | |
{ | |
return implode("\n", $value); | |
} | |
protected function makeShellVariableName($setting_name, $group) | |
{ | |
$params = $this->getParameters(); | |
$use_group_as_prefix = $params->get('use_group_as_prefix', false); | |
$capitalize_names = $params->get('capitalize_names', false); | |
$valid_name_regex = '/^[A-z_][A-z0-9_]*$/'; | |
if ($use_group_as_prefix && $group && $group !== ICheck::DEFAULT_GROUP_NAME) { | |
$prefix = $group . '_'; | |
} else { | |
$prefix = ''; | |
} | |
$name = $prefix . $setting_name; | |
if (!preg_match($valid_name_regex, $name)) { | |
throw new \Exception('"'.$name.'" is not a valid shell variable identifier.'); | |
} | |
if ($capitalize_names) { | |
$name = strtoupper($name); | |
} | |
return $name; | |
} | |
} |