Completed
Push — master ( 0a4926...d192d3 )
by Jan Philipp
24s queued 11s
created

ConfigMerger   A

Complexity

Total Complexity 28

Size/Duplication

Total Lines 187
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 28
lcom 1
cbo 3
dl 0
loc 187
rs 10
c 0
b 0
f 0

18 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A mergeOverride() 0 21 4
A mergeImport() 0 12 2
A mergeOverrideConfigEnvironments() 0 7 1
A mergeImportConfigEnvironments() 0 7 1
A mergeEnvironmentsAsOverride() 0 12 1
A mergeEnvironmentsAsImport() 0 12 1
A mergeDynamicVariables() 0 4 1
A mergeDotenvPaths() 0 4 1
A mergeRequiredVariables() 0 4 1
A mergeScriptsPaths() 0 4 1
A overrideScriptsPaths() 0 8 2
A mergeConstants() 0 4 1
A overrideTemplates() 0 8 2
A mergeTemplates() 0 4 1
A overrideHidden() 0 8 2
A getAllEnvironmentNames() 0 4 1
A mapEnvironments() 0 23 4
1
<?php declare(strict_types=1);
2
3
namespace Shopware\Psh\Config;
4
5
use Shopware\Psh\Application\RuntimeParameters;
6
use function array_keys;
7
use function array_merge;
8
9
class ConfigMerger
10
{
11
    /**
12
     * @var RuntimeParameters
13
     */
14
    private $runtimeParameters;
15
16
    public function __construct(RuntimeParameters $runtimeParameters)
17
    {
18
        $this->runtimeParameters = $runtimeParameters;
19
    }
20
21
    public function mergeOverride(Config $config, ?Config $override = null): Config
22
    {
23
        if ($override === null) {
24
            return $config;
25
        }
26
27
        $header = $config->getHeader();
28
        $defaultEnvironment = $config->getDefaultEnvironment();
29
30
        if ($override->getHeader()) {
31
            $header = $override->getHeader();
32
        }
33
34
        $environments = $this->mergeOverrideConfigEnvironments($config, $override);
35
36
        if ($override->getDefaultEnvironment()) {
37
            $defaultEnvironment = $override->getDefaultEnvironment();
38
        }
39
40
        return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $this->runtimeParameters, $header);
41
    }
42
43
    public function mergeImport(Config $config, ?Config $import = null): Config
44
    {
45
        if ($import === null) {
46
            return $config;
47
        }
48
49
        $header = $config->getHeader();
50
        $defaultEnvironment = $config->getDefaultEnvironment();
51
        $environments = $this->mergeImportConfigEnvironments($config, $import);
52
53
        return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $this->runtimeParameters, $header);
54
    }
55
56
    private function mergeOverrideConfigEnvironments(Config $config, Config $override): array
57
    {
58
        return $this->mapEnvironments($config, $override, function (ConfigEnvironment $environment, ConfigEnvironment $overrideEnvironment) {
59
            return $this
60
                    ->mergeEnvironmentsAsOverride($environment, $overrideEnvironment);
61
        });
62
    }
63
64
    private function mergeImportConfigEnvironments(Config $config, Config $import): array
65
    {
66
        return $this->mapEnvironments($config, $import, function (ConfigEnvironment $environment, ConfigEnvironment $importEnvironment) {
67
            return $this
68
                    ->mergeEnvironmentsAsImport($environment, $importEnvironment);
69
        });
70
    }
71
72
    private function mergeEnvironmentsAsOverride(ConfigEnvironment $original, ConfigEnvironment $override): ConfigEnvironment
73
    {
74
        return new ConfigEnvironment(
75
            $this->overrideHidden($original, $override),
76
            $this->overrideScriptsPaths($original, $override),
77
            $this->mergeDynamicVariables($original, $override),
78
            $this->mergeConstants($original, $override),
79
            $this->overrideTemplates($original, $override),
80
            $this->mergeDotenvPaths($original, $override),
81
            $this->mergeRequiredVariables($original, $override)
82
        );
83
    }
84
85
    private function mergeEnvironmentsAsImport(ConfigEnvironment $original, ConfigEnvironment $import): ConfigEnvironment
86
    {
87
        return new ConfigEnvironment(
88
            $this->overrideHidden($original, $import),
89
            $this->mergeScriptsPaths($original, $import),
90
            $this->mergeDynamicVariables($original, $import),
91
            $this->mergeConstants($original, $import),
92
            $this->mergeTemplates($original, $import),
93
            $this->mergeDotenvPaths($original, $import),
94
            $this->mergeRequiredVariables($original, $import)
95
        );
96
    }
97
98
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
99
    {
100
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
101
    }
102
103
    /**
104
     * @return ScriptsPath[]
105
     */
106
    private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
107
    {
108
        return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths());
109
    }
110
111
    /**
112
     * @return ScriptsPath[]
113
     */
114
    private function mergeRequiredVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
115
    {
116
        return array_merge($configEnvironment->getRequiredVariables(), $overrideConfigEnv->getRequiredVariables());
117
    }
118
119
    /**
120
     * @return ScriptsPath[]
121
     */
122
    private function mergeScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
123
    {
124
        return array_merge($configEnvironment->getAllScriptsPaths(), $overrideConfigEnv->getAllScriptsPaths());
125
    }
126
127
    /**
128
     * @return ScriptsPath[]
129
     */
130
    private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
131
    {
132
        if ($overrideConfigEnv->getAllScriptsPaths()) {
133
            return $overrideConfigEnv->getAllScriptsPaths();
134
        }
135
136
        return $configEnvironment->getAllScriptsPaths();
137
    }
138
139
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
140
    {
141
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
142
    }
143
144
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
145
    {
146
        if ($overrideConfigEnv->getTemplates()) {
147
            return $overrideConfigEnv->getTemplates();
148
        }
149
150
        return $configEnvironment->getTemplates();
151
    }
152
153
    private function mergeTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
154
    {
155
        return array_merge($configEnvironment->getTemplates(), $overrideConfigEnv->getTemplates());
156
    }
157
158
    private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool
159
    {
160
        if ($overrideEnv->isHidden()) {
161
            return true;
162
        }
163
164
        return $originalConfigEnv->isHidden();
165
    }
166
167
    private function getAllEnvironmentNames(Config $config, Config $override): array
168
    {
169
        return array_keys(array_merge($config->getEnvironments(), $override->getEnvironments()));
170
    }
171
172
    private function mapEnvironments(Config $config, Config $override, callable $closure): array
173
    {
174
        $environments = [];
175
176
        $foundEnvironments = $this->getAllEnvironmentNames($config, $override);
177
        foreach ($foundEnvironments as $name) {
178
            if (!isset($override->getEnvironments()[$name])) {
179
                $environments[$name] = $config->getEnvironments()[$name];
180
181
                continue;
182
            }
183
184
            if (!isset($config->getEnvironments()[$name])) {
185
                $environments[$name] = $override->getEnvironments()[$name];
186
187
                continue;
188
            }
189
190
            $environments[$name] = $closure($config->getEnvironments()[$name], $override->getEnvironments()[$name]);
191
        }
192
193
        return $environments;
194
    }
195
}
196