Completed
Pull Request — master (#196)
by Andreas
01:43
created

Config::validateConfigurationValues()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
1
<?php declare(strict_types = 1);
2
3
namespace Churn\Configuration;
4
5
use Webmozart\Assert\Assert;
6
7
class Config
8
{
9
    const DIRECTORIES_TO_SCAN = [];
10
    const FILES_TO_SHOW = 10;
11
    const MINIMUM_SCORE_TO_SHOW = 0.1;
12
    const AMOUNT_OF_PARALLEL_JOBS = 10;
13
    const SHOW_COMMITS_SINCE = '10 years ago';
14
    const FILES_TO_IGNORE = [];
15
    const FILE_EXTENSIONS_TO_PARSE = ['php'];
16
17
    /**
18
     * @var array
19
     */
20
    private $configuration;
21
22
    /**
23
     * Create a config with given configuration
24
     * @param array $configuration The array containing the configuration values.
25
     * @return Config
26
     */
27
    public static function create(array $configuration): Config
28
    {
29
        return new self($configuration);
30
    }
31
32
    /**
33
     * Create a config with default configuration
34
     * @return Config
35
     */
36
    public static function createFromDefaultValues(): Config
37
    {
38
        return new self();
39
    }
40
41
    /**
42
     * Config constructor.
43
     * @param array $configuration Raw config data.
44
     * @throws InvalidArgumentException If parameters is badly defined.
45
     */
46
    private function __construct(array $configuration = [])
47
    {
48
        if (!empty($configuration)) {
49
            $this->validateDirectoriesToScan($configuration);
50
            $this->validateFilesToShow($configuration);
51
            $this->validateMinScoreToShow($configuration);
52
            $this->validateParallelJobs($configuration);
53
            $this->validateCommitsSince($configuration);
54
            $this->validateFilesToIgnore($configuration);
55
            $this->validateFileExtensions($configuration);
56
        }
57
58
        $this->configuration = $configuration;
59
    }
60
61
    /**
62
     * Get the names of directories to scan
63
     *
64
     * @return string[]
65
     */
66
    public function getDirectoriesToScan(): array
67
    {
68
        return $this->configuration['directoriesToScan'] ?? self::DIRECTORIES_TO_SCAN;
69
    }
70
71
    /**
72
     * Get the number of files to display in the results table.
73
     * @return integer
74
     */
75
    public function getFilesToShow(): int
76
    {
77
        return $this->configuration['filesToShow'] ?? self::FILES_TO_SHOW;
78
    }
79
80
    /**
81
     * Get the minimum score a file need to display.
82
     * @return float
83
     */
84
    public function getMinScoreToShow(): float
85
    {
86
        return $this->configuration['minScoreToShow'] ?? self::MINIMUM_SCORE_TO_SHOW;
87
    }
88
89
    /**
90
     * Get the number of parallel jobs to use to process the files.
91
     * @return integer
92
     */
93
    public function getParallelJobs(): int
94
    {
95
        return $this->configuration['parallelJobs'] ?? self::AMOUNT_OF_PARALLEL_JOBS;
96
    }
97
98
    /**
99
     * Get how far back in the git history to go to count commits.
100
     * @return string
101
     */
102
    public function getCommitsSince(): string
103
    {
104
        return $this->configuration['commitsSince'] ?? self::SHOW_COMMITS_SINCE;
105
    }
106
107
    /**
108
     * Get the paths to files to ignore when processing.
109
     * @return array
110
     */
111
    public function getFilesToIgnore(): array
112
    {
113
        return $this->configuration['filesToIgnore'] ?? self::FILES_TO_IGNORE;
114
    }
115
116
    /**
117
     * Get the file extensions to use when processing.
118
     * @return array
119
     */
120
    public function getFileExtensions(): array
121
    {
122
        return $this->configuration['fileExtensions'] ?? self::FILE_EXTENSIONS_TO_PARSE;
123
    }
124
125
    /**
126
     * @param array $configuration The array containing the configuration values.
127
     * @return void
128
     */
129
    private function validateDirectoriesToScan(array $configuration): void
130
    {
131
        if (array_key_exists('directoriesToScan', $configuration)) {
132
            Assert::allString($configuration['directoriesToScan'], 'Directories to scan should be an array of strings');
133
        }
134
    }
135
136
    /**
137
     * @param array $configuration The array containing the configuration values.
138
     * @return void
139
     */
140
    private function validateFilesToShow(array $configuration): void
141
    {
142
        if (array_key_exists('filesToShow', $configuration)) {
143
            Assert::integer($configuration['filesToShow'], 'Files to show should be an integer');
144
        }
145
    }
146
147
    /**
148
     * @param array $configuration The array containing the configuration values.
149
     * @return void
150
     */
151
    private function validateMinScoreToShow(array $configuration): void
152
    {
153
        if (array_key_exists('minScoreToShow', $configuration)) {
154
            Assert::numeric($configuration['minScoreToShow'], 'Minimum score to show should be a number');
155
        }
156
    }
157
158
    /**
159
     * @param array $configuration The array containing the configuration values.
160
     * @return void
161
     */
162
    private function validateParallelJobs(array $configuration): void
163
    {
164
        if (array_key_exists('parallelJobs', $configuration)) {
165
            Assert::integer($configuration['parallelJobs'], 'Amount of parallel jobs should be an integer');
166
        }
167
    }
168
169
    /**
170
     * @param array $configuration The array containing the configuration values.
171
     * @return void
172
     * @throws InvalidArgumentException If date is in a bad format.
173
     */
174
    private function validateCommitsSince(array $configuration): void
175
    {
176
        if (array_key_exists('commitsSince', $configuration)) {
177
            Assert::string($configuration['commitsSince'], 'Commits since should be a string');
178
        }
179
    }
180
181
    /**
182
     * @param array $configuration The array containing the configuration values.
183
     * @return void
184
     */
185
    private function validateFilesToIgnore(array $configuration): void
186
    {
187
        if (array_key_exists('filesToIgnore', $configuration)) {
188
            Assert::isArray($configuration['filesToIgnore'], 'Files to ignore should be an array of strings');
189
        }
190
    }
191
192
    /**
193
     * @param array $configuration The array containing the configuration values.
194
     * @return void
195
     */
196
    private function validateFileExtensions(array $configuration): void
197
    {
198
        if (array_key_exists('fileExtensions', $configuration)) {
199
            Assert::isArray($configuration['fileExtensions'], 'File extensions should be an array of strings');
200
        }
201
    }
202
}
203