Completed
Pull Request — master (#93)
by Jan Philipp
02:48 queued 01:03
created

ConfigMerger::mergeConfigEnvironments()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 9.472
c 0
b 0
f 0
cc 3
nc 3
nop 2
1
<?php declare(strict_types=1);
2
3
namespace Shopware\Psh\Config;
4
5
class ConfigMerger
6
{
7
    /**
8
     * @param Config $config
9
     * @param Config|null $override
10
     * @return Config
11
     */
12
    public function merge(Config $config, Config $override = null): Config
13
    {
14
        if ($override === null) {
15
            return $config;
16
        }
17
18
        $header = $config->getHeader();
19
        $defaultEnvironment = $config->getDefaultEnvironment();
20
        $environments = $config->getEnvironments();
21
22
        if ($override->getHeader()) {
23
            $header = $override->getHeader();
24
        }
25
26
        if ($override->getEnvironments()) {
27
            $environments = $this->mergeConfigEnvironments($config, $override);
28
        }
29
30
        if ($override->getDefaultEnvironment()) {
31
            $defaultEnvironment = $override->getDefaultEnvironment();
32
        }
33
34
        return new Config($header, $defaultEnvironment, $environments, $config->getParams());
35
    }
36
37
    /**
38
     * @param Config $config
39
     * @param Config $override
40
     * @return array
41
     */
42
    private function mergeConfigEnvironments(Config $config, Config $override): array
43
    {
44
        $environments = [];
45
46
        $foundEnvironments = array_keys(array_merge($config->getEnvironments(), $override->getEnvironments()));
47
48
        foreach ($foundEnvironments as $name) {
49
            if (!isset($override->getEnvironments()[$name])) {
50
                $environments[$name] = $config->getEnvironments();
51
52
                continue;
53
            }
54
55
            $overrideEnv = $override->getEnvironments()[$name];
56
            $originalConfigEnv = $config->getEnvironments()[$name] ?? new ConfigEnvironment();
0 ignored issues
show
Bug introduced by
The call to ConfigEnvironment::__construct() misses a required argument $hidden.

This check looks for function calls that miss required arguments.

Loading history...
57
58
            $environments[$name] = new ConfigEnvironment(
59
                $this->overrideHidden($originalConfigEnv, $overrideEnv),
60
                $this->overrideScriptsPaths($originalConfigEnv, $overrideEnv),
61
                $this->mergeDynamicVariables($originalConfigEnv, $overrideEnv),
62
                $this->mergeConstants($originalConfigEnv, $overrideEnv),
63
                $this->overrideTemplates($originalConfigEnv, $overrideEnv),
64
                $this->mergeDotenvPaths($originalConfigEnv, $overrideEnv)
65
            );
66
        }
67
68
        return $environments;
69
    }
70
71
    /**
72
     * @param ConfigEnvironment $configEnvironment
73
     * @param ConfigEnvironment $overrideEnv
74
     * @return array
75
     */
76
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
77
    {
78
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
79
    }
80
81
    /**
82
     * @param ConfigEnvironment $configEnvironment
83
     * @param ConfigEnvironment $overrideConfigEnv
84
     * @return ScriptsPath[]
85
     */
86
    private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
87
    {
88
        return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths());
89
    }
90
91
    /**
92
     * @param ConfigEnvironment $configEnvironment
93
     * @param ConfigEnvironment $overrideConfigEnv
94
     * @return ScriptsPath[]
95
     */
96
    private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
97
    {
98
        if ($overrideConfigEnv->getAllScriptsPaths()) {
99
            return $overrideConfigEnv->getAllScriptsPaths();
100
        }
101
102
        return $configEnvironment->getAllScriptsPaths();
103
    }
104
105
    /**
106
     * @param ConfigEnvironment $configEnvironment
107
     * @param ConfigEnvironment $overrideConfigEnv
108
     * @return array
109
     */
110
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
111
    {
112
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
113
    }
114
115
    /**
116
     * @param ConfigEnvironment $configEnvironment
117
     * @param $overrideConfigEnv
118
     * @return array
119
     */
120
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
121
    {
122
        if ($overrideConfigEnv->getTemplates()) {
123
            return $overrideConfigEnv->getTemplates();
124
        }
125
126
        return $configEnvironment->getTemplates();
127
    }
128
129
    private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool
130
    {
131
        if ($overrideEnv->isHidden()) {
132
            return true;
133
        }
134
135
        return $originalConfigEnv->isHidden();
136
    }
137
}
138