Completed
Pull Request — master (#86)
by Jan Philipp
01:42
created

ConfigMerger   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 113
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 0
loc 113
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A merge() 0 24 5
A mergeConfigEnvironments() 0 17 2
A mergeDynamicVariables() 0 4 1
A mergeDotenvPaths() 0 4 1
A overrideCommandPaths() 0 8 2
A mergeConstants() 0 4 1
A overrideTemplates() 0 8 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
        foreach ($override->getEnvironments() as $name => $overrideEnv) {
46
            $originalConfigEnv = $config->getEnvironments()[$name];
47
48
            $environments[$name] = new ConfigEnvironment(
49
                $this->overrideCommandPaths($originalConfigEnv, $overrideEnv),
50
                $this->mergeDynamicVariables($config->getEnvironments()[$name], $overrideEnv),
51
                $this->mergeConstants($config->getEnvironments()[$name], $overrideEnv),
52
                $this->overrideTemplates($config->getEnvironments()[$name], $overrideEnv),
53
                $this->mergeDotenvPaths($originalConfigEnv, $overrideEnv)
54
            );
55
        }
56
57
        return $environments;
58
    }
59
60
    /**
61
     * @param ConfigEnvironment $configEnvironment
62
     * @param ConfigEnvironment $overrideEnv
63
     * @return array
64
     */
65
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
66
    {
67
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
68
    }
69
70
    /**
71
     * @param ConfigEnvironment $configEnvironment
72
     * @param ConfigEnvironment $overrideConfigEnv
73
     * @return array|ScriptPath[]
74
     */
75
    private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
76
    {
77
        return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths());
78
    }
79
80
    /**
81
     * @param ConfigEnvironment $configEnvironment
82
     * @param ConfigEnvironment $overrideConfigEnv
83
     * @return array|ScriptPath[]
84
     */
85
    private function overrideCommandPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
86
    {
87
        if ($overrideConfigEnv->getAllScriptPaths()) {
88
            return $overrideConfigEnv->getAllScriptPaths();
89
        }
90
91
        return $configEnvironment->getAllScriptPaths();
92
    }
93
94
    /**
95
     * @param ConfigEnvironment $configEnvironment
96
     * @param ConfigEnvironment $overrideConfigEnv
97
     * @return array
98
     */
99
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
100
    {
101
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
102
    }
103
104
    /**
105
     * @param ConfigEnvironment $configEnvironment
106
     * @param $overrideConfigEnv
107
     * @return array
108
     */
109
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
110
    {
111
        if ($overrideConfigEnv->getTemplates()) {
112
            return $overrideConfigEnv->getTemplates();
113
        }
114
115
        return $configEnvironment->getTemplates();
116
    }
117
}
118