Failed Conditions
Pull Request — master (#10)
by Yo
02:50
created

ConfigurationUpdater::mergeEntity()   B

Complexity

Conditions 5
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 12
ccs 0
cts 11
cp 0
rs 8.8571
cc 5
eloc 7
nc 2
nop 2
crap 30
1
<?php
2
namespace Yoanm\ComposerConfigManager\Application\Updater;
3
4
use Yoanm\ComposerConfigManager\Domain\Model\Author;
5
use Yoanm\ComposerConfigManager\Domain\Model\Autoload;
6
use Yoanm\ComposerConfigManager\Domain\Model\Configuration;
7
use Yoanm\ComposerConfigManager\Domain\Model\ConfigurationItemInterface;
8
use Yoanm\ComposerConfigManager\Domain\Model\Package;
9
use Yoanm\ComposerConfigManager\Domain\Model\Script;
10
use Yoanm\ComposerConfigManager\Domain\Model\SuggestedPackage;
11
use Yoanm\ComposerConfigManager\Domain\Model\Support;
12
13
class ConfigurationUpdater
14
{
15
    /**
16
     * @param Configuration $baseConfiguration
17
     * @param Configuration $newConfiguration
18
     *
19
     * @return Configuration
20
     */
21
    public function update(Configuration $baseConfiguration, Configuration $newConfiguration)
22
    {
23
        return new Configuration(
24
            $this->updateIfDefined($newConfiguration->getPackageName(), $baseConfiguration->getPackageName()),
25
            $this->updateIfDefined($newConfiguration->getType(), $baseConfiguration->getType()),
26
            $this->updateIfDefined($newConfiguration->getLicense(), $baseConfiguration->getLicense()),
27
            $this->updateIfDefined($newConfiguration->getPackageVersion(), $baseConfiguration->getPackageVersion()),
28
            $this->updateIfDefined($newConfiguration->getDescription(), $baseConfiguration->getDescription()),
29
            $this->mergeKeywordList($newConfiguration->getKeywordList(), $baseConfiguration->getKeywordList()),
30
            $this->updateList($newConfiguration->getAuthorList(), $baseConfiguration->getAuthorList()),
31
            $this->updateList(
32
                $newConfiguration->getProvidedPackageList(),
33
                $baseConfiguration->getProvidedPackageList()
34
            ),
35
            $this->updateList(
36
                $newConfiguration->getSuggestedPackageList(),
37
                $baseConfiguration->getSuggestedPackageList()
38
            ),
39
            $this->updateList($newConfiguration->getSupportList(), $baseConfiguration->getSupportList()),
40
            $this->updateList($newConfiguration->getAutoloadList(), $baseConfiguration->getAutoloadList()),
41
            $this->updateList($newConfiguration->getAutoloadDevList(), $baseConfiguration->getAutoloadDevList()),
42
            $this->updateList(
43
                $newConfiguration->getRequiredPackageList(),
44
                $baseConfiguration->getRequiredPackageList()
45
            ),
46
            $this->updateList(
47
                $newConfiguration->getRequiredDevPackageList(),
48
                $baseConfiguration->getRequiredDevPackageList()
49
            ),
50
            $this->updateList($newConfiguration->getScriptList(), $baseConfiguration->getScriptList())
51
        );
52
    }
53
54
    /**
55
     * @param string $baseValue
56
     * @param string $newValue
57
     *
58
     * @return string
59
     */
60
    protected function updateIfDefined($newValue, $baseValue)
61
    {
62
        return $newValue ? $newValue : $baseValue;
63
    }
64
65
    /**
66
     * @param string[] $newList
67
     * @param string[] $oldList
68
     *
69
     * @return string[]
70
     */
71
    protected function mergeKeywordList(array $oldList, array $newList)
72
    {
73
        return array_values(
74
            array_unique(
75
                array_merge($newList, $oldList)
76
            )
77
        );
78
    }
79
80
    /**
81
     * @param ConfigurationItemInterface[] $newEntityList
82
     * @param ConfigurationItemInterface[] $oldEntityList
83
     *
84
     * @return ConfigurationItemInterface[]
85
     */
86
    protected function updateList(array $newEntityList, array $oldEntityList)
87
    {
88
        $existingEntityIdList = [];
89
        foreach ($newEntityList as $entity) {
90
            $existingEntityIdList[$entity->getItemId()] = true;
91
        }
92
        $normalizedOldEntityList = [];
93
        foreach ($oldEntityList as $oldEntity) {
94
            if (!array_key_exists($oldEntity->getItemId(), $existingEntityIdList)) {
95
                $normalizedOldEntityList[] = $oldEntity;
96
            } else {
97
                // A new entity have been defined, loop over new entity list and append all entities with the same id
98
                $oldEntityId = $oldEntity->getItemId();
99
                foreach ($newEntityList as $newEntityKey => $newEntity) {
100
                    if ($newEntity->getItemId() == $oldEntityId) {
101
                        $normalizedOldEntityList[] = $this->mergeEntity($oldEntity, $newEntity);
102
                        unset($newEntityList[$newEntityKey]);
103
                    }
104
                }
105
            }
106
        }
107
108
        return array_merge($normalizedOldEntityList, $newEntityList);
109
    }
110
111
    /**
112
     * @param ConfigurationItemInterface $oldEntity
113
     * @param ConfigurationItemInterface $newEntity
114
     *
115
     * @return ConfigurationItemInterface
116
     */
117
    protected function mergeEntity($oldEntity, $newEntity)
118
    {
119
        if ($newEntity instanceof Author && $oldEntity instanceof Author) {
120
            return new Author(
121
                $newEntity->getName(),
122
                $newEntity->getEmail() ? $newEntity->getEmail() : $oldEntity->getEmail(),
123
                $newEntity->getRole() ? $newEntity->getRole() : $oldEntity->getRole()
124
            );
125
        }
126
127
        return $newEntity;
128
    }
129
}
130