Completed
Pull Request — master (#125)
by Matthias
01:41
created

Config::validateDirectoriesToScan()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 1
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;
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->validateConfigurationValues($configuration);
50
        }
51
52
        $this->configuration = $configuration;
53
    }
54
55
    /**
56
     * Get the names of directories to scan
57
     *
58
     * @return string[]
59
     */
60
    public function getDirectoriesToScan(): array
61
    {
62
        return $this->configuration['directoriesToScan'] ?? self::DIRECTORIES_TO_SCAN;
63
    }
64
65
    /**
66
     * Get the number of files to display in the results table.
67
     * @return integer
68
     */
69
    public function getFilesToShow(): int
70
    {
71
        return $this->configuration['filesToShow'] ?? self::FILES_TO_SHOW;
72
    }
73
74
    /**
75
     * Get the minimum score a file need to display.
76
     * @return integer
77
     */
78
    public function getMinScoreToShow(): int
79
    {
80
        return $this->configuration['minScoreToShow'] ?? self::MINIMUM_SCORE_TO_SHOW;
81
    }
82
83
    /**
84
     * Get the number of parallel jobs to use to process the files.
85
     * @return integer
86
     */
87
    public function getParallelJobs(): int
88
    {
89
        return $this->configuration['parallelJobs'] ?? self::AMOUNT_OF_PARALLEL_JOBS;
90
    }
91
92
    /**
93
     * Get how far back in the git history to go to count commits.
94
     * @return string
95
     */
96
    public function getCommitsSince(): string
97
    {
98
        return $this->configuration['commitsSince'] ?? self::SHOW_COMMITS_SINCE;
99
    }
100
101
    /**
102
     * Get the paths to files to ignore when processing.
103
     * @return array
104
     */
105
    public function getFilesToIgnore(): array
106
    {
107
        return $this->configuration['filesToIgnore'] ?? self::FILES_TO_IGNORE;
108
    }
109
110
    /**
111
     * Get the file extensions to use when processing.
112
     * @return array
113
     */
114
    public function getFileExtensions(): array
115
    {
116
        return $this->configuration['fileExtensions'] ?? self::FILE_EXTENSIONS_TO_PARSE;
117
    }
118
119
    /**
120
     * @param array $configuration The array containing the configuration values.
121
     * @return void
122
     */
123
    private function validateConfigurationValues(array $configuration)
124
    {
125
        $this->validateDirectoriesToScan($configuration);
126
        $this->validateFilesToShow($configuration);
127
        $this->validateMinScoreToShow($configuration);
128
        $this->validateParallelJobs($configuration);
129
        $this->validateCommitsSince($configuration);
130
        $this->validateFilesToIgnore($configuration);
131
        $this->validateFileExtensions($configuration);
132
    }
133
134
    /**
135
     * @param array $configuration The array containing the configuration values.
136
     * @return void
137
     */
138
    private function validateDirectoriesToScan(array $configuration)
139
    {
140
        if (array_key_exists('directoriesToScan', $configuration)) {
141
            Assert::allString($configuration['directoriesToScan'], 'Directories to scan should be an array of strings');
142
        }
143
    }
144
145
    /**
146
     * @param array $configuration The array containing the configuration values.
147
     * @return void
148
     */
149
    private function validateFilesToShow(array $configuration)
150
    {
151
        if (array_key_exists('filesToShow', $configuration)) {
152
            Assert::integer($configuration['filesToShow'], 'Files to show should be an integer');
153
        }
154
    }
155
156
    /**
157
     * @param array $configuration The array containing the configuration values.
158
     * @return void
159
     */
160
    private function validateMinScoreToShow(array $configuration)
161
    {
162
        if (array_key_exists('minScoreToShow', $configuration)) {
163
            Assert::integer($configuration['minScoreToShow'], 'Minimum score to show should be an integer');
164
        }
165
    }
166
167
    /**
168
     * @param array $configuration The array containing the configuration values.
169
     * @return void
170
     */
171
    private function validateParallelJobs(array $configuration)
172
    {
173
        if (array_key_exists('parallelJobs', $configuration)) {
174
            Assert::integer($configuration['parallelJobs'], 'Amount of parallel jobs should be an integer');
175
        }
176
    }
177
178
    /**
179
     * @param array $configuration The array containing the configuration values.
180
     * @return void
181
     * @throws InvalidArgumentException If date is in a bad format.
182
     */
183
    private function validateCommitsSince(array $configuration)
184
    {
185
        if (array_key_exists('commitsSince', $configuration)) {
186
            Assert::string($configuration['commitsSince'], 'Commits since should be a string');
187
        }
188
    }
189
190
    /**
191
     * @param array $configuration The array containing the configuration values.
192
     * @return void
193
     */
194
    private function validateFilesToIgnore(array $configuration)
195
    {
196
        if (array_key_exists('filesToIgnore', $configuration)) {
197
            Assert::isArray($configuration['filesToIgnore'], 'Files to ignore should be an array of strings');
198
        }
199
    }
200
201
    /**
202
     * @param array $configuration The array containing the configuration values.
203
     * @return void
204
     */
205
    private function validateFileExtensions(array $configuration)
206
    {
207
        if (array_key_exists('fileExtensions', $configuration)) {
208
            Assert::isArray($configuration['fileExtensions'], 'File extensions should be an array of strings');
209
        }
210
    }
211
}
212