Completed
Push — master ( 482c5f...79d98c )
by Jan Philipp
13s queued 11s
created

ConfigMerger::merge()   A

Complexity

Conditions 5
Paths 9

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 9.2248
c 0
b 0
f 0
cc 5
nc 9
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 View Code Duplication
            if (!isset($override->getEnvironments()[$name])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
50
                $environments[$name] = $config->getEnvironments()[$name];
51
52
                continue;
53
            }
54
55 View Code Duplication
            if (!isset($config->getEnvironments()[$name])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

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