Passed
Pull Request — master (#297)
by Fabien
02:28
created

Config::setDirectoriesToScan()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

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