-
-
Notifications
You must be signed in to change notification settings - Fork 133
Expand file tree
/
Copy pathConfigDumper.php
More file actions
121 lines (102 loc) · 3.67 KB
/
Copy pathConfigDumper.php
File metadata and controls
121 lines (102 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
namespace PhpBench\Development;
use PhpBench\DependencyInjection\ExtensionInterface;
use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector;
use Symfony\Component\OptionsResolver\Exception\NoConfigurationException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use function json_encode;
use function mb_strlen;
use function method_exists;
use function str_repeat;
class ConfigDumper
{
public const TITLE = 'Configuration';
/**
* @var class-string[]
*/
private $extensions;
/**
* @param class-string[] $extensions
*/
public function __construct(array $extensions)
{
$this->extensions = $extensions;
}
public function dump(): string
{
if (!method_exists(OptionsResolver::class, 'getInfo')) {
return 'Config reference generation requires Symfony Options Resolver ^5.0';
}
$sections = [
self::TITLE,
$this->underline(self::TITLE, '='),
'',
'.. include:: configuration-prelude.rst',
'',
'.. contents::',
' :depth: 2',
' :local:',
'',
];
foreach ($this->extensions as $extensionClass) {
$optionsResolver = new OptionsResolver();
$extension = new $extensionClass();
assert($extension instanceof ExtensionInterface);
$extension->configure($optionsResolver);
if (!$optionsResolver->getDefinedOptions()) {
continue;
}
$inspector = new OptionsResolverIntrospector($optionsResolver);
$sections[] = $this->generateSection($extensionClass, $optionsResolver, $inspector);
}
return implode("\n", $sections);
}
private function generateSection(string $extensionClass, OptionsResolver $optionsResolver, OptionsResolverIntrospector $inspector): string
{
$shortName = substr($extensionClass, (int)strrpos($extensionClass, '\\') + 1);
$shortName = substr($shortName, 0, (int)strrpos($shortName, 'Extension'));
$section = [
$shortName,
$this->underline($shortName, '-'),
'',
sprintf('Extension class: ``%s``', $extensionClass),
''
];
foreach ($optionsResolver->getDefinedOptions() as $option) {
$section[] = sprintf('.. _configuration_%s:', str_replace('.', '_', $option));
$section[] = '';
$section[] = $option;
$section[] = $this->underline($option, '~');
$section[] = '';
$section[] = $optionsResolver->getInfo($option);
$section[] = '';
$section[] = sprintf('Default: ``%s``', $this->prettyPrint($inspector->getDefault($option)));
$section[] = '';
$section[] = sprintf('Types: ``%s``', $this->prettyPrint($inspector->getAllowedTypes($option)));
$section[] = '';
try {
$section[] = sprintf('Allowed values: ``%s``', $this->prettyPrint($inspector->getAllowedValues($option)));
$section[] = '';
} catch (NoConfigurationException $e) {
}
}
return implode("\n", $section);
}
private function underline(string $string, string $char): string
{
return str_repeat($char, mb_strlen($string));
}
private function prettyPrint($value): string
{
if (is_bool($value)) {
return $value ? 'true' : 'false';
}
if (is_scalar($value)) {
return (string)$value;
}
if (is_null($value)) {
return 'NULL';
}
return json_encode($value);
}
}