1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace PHPChunkit; |
4
|
|
|
|
5
|
|
|
use InvalidArgumentException; |
6
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcher; |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* @testClass PHPChunkit\Test\ConfigurationTest |
10
|
|
|
*/ |
11
|
|
|
class Configuration |
12
|
|
|
{ |
13
|
|
|
/** |
14
|
|
|
* @var string |
15
|
|
|
*/ |
16
|
|
|
private $rootDir = ''; |
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* @var array |
20
|
|
|
*/ |
21
|
|
|
private $watchDirectories = []; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* @var string |
25
|
|
|
*/ |
26
|
|
|
private $testsDirectory = ''; |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* @var string |
30
|
|
|
*/ |
31
|
|
|
private $bootstrapPath = ''; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
* @var string |
35
|
|
|
*/ |
36
|
|
|
private $phpunitPath = 'vendor/bin/phpunit'; |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* @var null|EventDispatcher |
40
|
|
|
*/ |
41
|
|
|
private $eventDispatcher; |
42
|
|
|
|
43
|
|
|
/** |
44
|
|
|
* @var null|DatabaseSandbox |
45
|
|
|
*/ |
46
|
|
|
private $databaseSandbox; |
47
|
|
|
|
48
|
|
|
/** |
49
|
|
|
* @var string |
50
|
|
|
*/ |
51
|
|
|
private $memoryLimit = '256M'; |
52
|
|
|
|
53
|
|
|
/** |
54
|
|
|
* @var int |
55
|
|
|
*/ |
56
|
|
|
private $numChunks = 1; |
57
|
|
|
|
58
|
2 |
|
public static function createFromXmlFile(string $path) : self |
59
|
|
|
{ |
60
|
2 |
|
if (!file_exists($path)) { |
61
|
|
|
throw new \InvalidArgumentException(sprintf('XML file count not be found at path "%s"', $path)); |
62
|
|
|
} |
63
|
|
|
|
64
|
2 |
|
$configuration = new self(); |
65
|
|
|
|
66
|
2 |
|
$xml = simplexml_load_file($path); |
67
|
2 |
|
$attributes = $xml->attributes(); |
68
|
|
|
|
69
|
2 |
|
if ($rootDir = (string) $attributes['root-dir']) { |
70
|
2 |
|
$configuration->setRootDir($rootDir); |
71
|
|
|
} |
72
|
|
|
|
73
|
2 |
|
if ($bootstrapPath = (string) $attributes['bootstrap']) { |
74
|
2 |
|
$configuration->setBootstrapPath($bootstrapPath); |
75
|
|
|
} |
76
|
|
|
|
77
|
2 |
|
if ($testsDir = (string) $attributes['tests-dir']) { |
78
|
2 |
|
$configuration->setTestsDirectory($testsDir); |
79
|
|
|
} |
80
|
|
|
|
81
|
2 |
|
if ($phpunitPath = (string) $attributes['phpunit-path']) { |
82
|
2 |
|
$configuration->setPhpunitPath($phpunitPath); |
83
|
|
|
} |
84
|
|
|
|
85
|
2 |
|
if ($memoryLimit = (string) $attributes['memory-limit']) { |
86
|
2 |
|
$configuration->setMemoryLimit($memoryLimit); |
87
|
|
|
} |
88
|
|
|
|
89
|
2 |
|
if ($numChunks = (int) $attributes['num-chunks']) { |
90
|
2 |
|
$configuration->setNumChunks($numChunks); |
91
|
|
|
} |
92
|
|
|
|
93
|
2 |
|
if ($watchDirectories = (array) $xml->{'watch-directories'}->{'watch-directory'}) { |
94
|
2 |
|
$configuration->setWatchDirectories($watchDirectories); |
95
|
|
|
} |
96
|
|
|
|
97
|
2 |
|
if ($databaseNames = (array) $xml->{'database-names'}->{'database-name'}) { |
98
|
2 |
|
$configuration->setDatabaseNames($databaseNames); |
99
|
|
|
} |
100
|
|
|
|
101
|
2 |
|
$events = (array) $xml->{'events'}; |
102
|
2 |
|
$listeners = $events['listener'] ?? null; |
103
|
|
|
|
104
|
2 |
|
if ($listeners) { |
105
|
2 |
|
$eventDispatcher = $configuration->getEventDispatcher(); |
106
|
|
|
|
107
|
2 |
|
foreach ($listeners as $listener) { |
108
|
2 |
|
$eventName = (string) $listener->attributes()['event']; |
109
|
2 |
|
$className = (string) $listener->class; |
110
|
|
|
|
111
|
2 |
|
$listener = new $className($configuration); |
112
|
|
|
|
113
|
2 |
|
if (!$listener instanceof ListenerInterface) { |
114
|
|
|
throw new InvalidArgumentException( |
115
|
|
|
sprintf('%s does not implement %s', $className, ListenerInterface::class) |
116
|
|
|
); |
117
|
|
|
} |
118
|
|
|
|
119
|
2 |
|
$eventDispatcher->addListener($eventName, [$listener, 'execute']); |
120
|
|
|
} |
121
|
|
|
} |
122
|
|
|
|
123
|
2 |
|
return $configuration; |
124
|
|
|
} |
125
|
|
|
|
126
|
10 |
View Code Duplication |
public function setRootDir(string $rootDir) : self |
|
|
|
|
127
|
|
|
{ |
128
|
10 |
|
if (!is_dir($rootDir)) { |
129
|
1 |
|
throw new \InvalidArgumentException( |
130
|
1 |
|
sprintf('Root directory "%s" does not exist.', $rootDir) |
131
|
|
|
); |
132
|
|
|
} |
133
|
|
|
|
134
|
9 |
|
$this->rootDir = realpath($rootDir); |
135
|
|
|
|
136
|
9 |
|
return $this; |
137
|
|
|
} |
138
|
|
|
|
139
|
4 |
|
public function getRootDir() : string |
140
|
|
|
{ |
141
|
4 |
|
return $this->rootDir; |
142
|
|
|
} |
143
|
|
|
|
144
|
5 |
|
public function setWatchDirectories(array $watchDirectories) : self |
145
|
|
|
{ |
146
|
5 |
|
foreach ($watchDirectories as $key => $watchDirectory) { |
147
|
5 |
|
if (!is_dir($watchDirectory)) { |
148
|
1 |
|
throw new \InvalidArgumentException( |
149
|
1 |
|
sprintf('Watch directory "%s" does not exist.', $watchDirectory) |
150
|
|
|
); |
151
|
|
|
} |
152
|
|
|
|
153
|
4 |
|
$watchDirectories[$key] = realpath($watchDirectory); |
154
|
|
|
} |
155
|
|
|
|
156
|
4 |
|
$this->watchDirectories = $watchDirectories; |
157
|
|
|
|
158
|
4 |
|
return $this; |
159
|
|
|
} |
160
|
|
|
|
161
|
3 |
|
public function getWatchDirectories() : array |
162
|
|
|
{ |
163
|
3 |
|
return $this->watchDirectories; |
164
|
|
|
} |
165
|
|
|
|
166
|
5 |
View Code Duplication |
public function setTestsDirectory(string $testsDirectory) : self |
|
|
|
|
167
|
|
|
{ |
168
|
5 |
|
if (!is_dir($testsDirectory)) { |
169
|
1 |
|
throw new \InvalidArgumentException( |
170
|
1 |
|
sprintf('Tests directory "%s" does not exist.', $testsDirectory) |
171
|
|
|
); |
172
|
|
|
} |
173
|
|
|
|
174
|
4 |
|
$this->testsDirectory = realpath($testsDirectory); |
175
|
|
|
|
176
|
4 |
|
return $this; |
177
|
|
|
} |
178
|
|
|
|
179
|
3 |
|
public function getTestsDirectory() : string |
180
|
|
|
{ |
181
|
3 |
|
return $this->testsDirectory; |
182
|
|
|
} |
183
|
|
|
|
184
|
4 |
View Code Duplication |
public function setBootstrapPath(string $bootstrapPath) : self |
|
|
|
|
185
|
|
|
{ |
186
|
4 |
|
if (!file_exists($bootstrapPath)) { |
187
|
1 |
|
throw new \InvalidArgumentException( |
188
|
1 |
|
sprintf('Bootstrap path "%s" does not exist.', $bootstrapPath) |
189
|
|
|
); |
190
|
|
|
} |
191
|
|
|
|
192
|
3 |
|
$this->bootstrapPath = realpath($bootstrapPath); |
193
|
|
|
|
194
|
3 |
|
return $this; |
195
|
|
|
} |
196
|
|
|
|
197
|
3 |
|
public function getBootstrapPath() : string |
198
|
|
|
{ |
199
|
3 |
|
return $this->bootstrapPath; |
200
|
|
|
} |
201
|
|
|
|
202
|
10 |
View Code Duplication |
public function setPhpunitPath(string $phpunitPath) : self |
|
|
|
|
203
|
|
|
{ |
204
|
10 |
|
if (!file_exists($phpunitPath)) { |
205
|
1 |
|
throw new \InvalidArgumentException( |
206
|
1 |
|
sprintf('PHPUnit path "%s" does not exist.', $phpunitPath) |
207
|
|
|
); |
208
|
|
|
} |
209
|
|
|
|
210
|
9 |
|
$this->phpunitPath = realpath($phpunitPath); |
211
|
|
|
|
212
|
9 |
|
return $this; |
213
|
|
|
} |
214
|
|
|
|
215
|
3 |
|
public function getPhpunitPath() : string |
216
|
|
|
{ |
217
|
3 |
|
return $this->phpunitPath; |
218
|
|
|
} |
219
|
|
|
|
220
|
1 |
|
public function setDatabaseSandbox(DatabaseSandbox $databaseSandbox) : self |
221
|
|
|
{ |
222
|
1 |
|
$this->databaseSandbox = $databaseSandbox; |
223
|
|
|
|
224
|
1 |
|
return $this; |
225
|
|
|
} |
226
|
|
|
|
227
|
4 |
|
public function getDatabaseSandbox() : DatabaseSandbox |
228
|
|
|
{ |
229
|
4 |
|
if ($this->databaseSandbox === null) { |
230
|
4 |
|
$this->databaseSandbox = new DatabaseSandbox(); |
231
|
|
|
} |
232
|
|
|
|
233
|
4 |
|
return $this->databaseSandbox; |
234
|
|
|
} |
235
|
|
|
|
236
|
3 |
|
public function setDatabaseNames(array $databaseNames) : self |
237
|
|
|
{ |
238
|
3 |
|
$this->getDatabaseSandbox()->setDatabaseNames($databaseNames); |
239
|
|
|
|
240
|
3 |
|
return $this; |
241
|
|
|
} |
242
|
|
|
|
243
|
1 |
|
public function setSandboxEnabled(bool $sandboxEnabled) : self |
244
|
|
|
{ |
245
|
1 |
|
$this->getDatabaseSandbox()->setSandboxEnabled($sandboxEnabled); |
246
|
|
|
|
247
|
1 |
|
return $this; |
248
|
|
|
} |
249
|
|
|
|
250
|
2 |
|
public function setMemoryLimit(string $memoryLimit) : self |
251
|
|
|
{ |
252
|
2 |
|
$this->memoryLimit = $memoryLimit; |
253
|
|
|
|
254
|
2 |
|
return $this; |
255
|
|
|
} |
256
|
|
|
|
257
|
2 |
|
public function getMemoryLimit() : string |
258
|
|
|
{ |
259
|
2 |
|
return $this->memoryLimit; |
260
|
|
|
} |
261
|
|
|
|
262
|
2 |
|
public function setNumChunks(int $numChunks) : self |
263
|
|
|
{ |
264
|
2 |
|
$this->numChunks = $numChunks; |
265
|
|
|
|
266
|
2 |
|
return $this; |
267
|
|
|
} |
268
|
|
|
|
269
|
1 |
|
public function getNumChunks() : int |
270
|
|
|
{ |
271
|
1 |
|
return $this->numChunks; |
272
|
|
|
} |
273
|
|
|
|
274
|
1 |
|
public function setEventDispatcher(EventDispatcher $eventDispatcher) : self |
275
|
|
|
{ |
276
|
1 |
|
$this->eventDispatcher = $eventDispatcher; |
277
|
|
|
|
278
|
1 |
|
return $this; |
279
|
|
|
} |
280
|
|
|
|
281
|
3 |
|
public function getEventDispatcher() : EventDispatcher |
282
|
|
|
{ |
283
|
3 |
|
if ($this->eventDispatcher === null) { |
284
|
3 |
|
$this->eventDispatcher = new EventDispatcher(); |
285
|
|
|
} |
286
|
|
|
|
287
|
3 |
|
return $this->eventDispatcher; |
288
|
|
|
} |
289
|
|
|
|
290
|
2 |
|
public function throwExceptionIfConfigurationIncomplete() |
291
|
|
|
{ |
292
|
2 |
|
if (!$this->rootDir) { |
293
|
1 |
|
throw new \InvalidArgumentException('You must configure a root directory.'); |
294
|
|
|
} |
295
|
|
|
|
296
|
1 |
|
if (!$this->watchDirectories) { |
|
|
|
|
297
|
|
|
throw new \InvalidArgumentException('You must configure a watch directory.'); |
298
|
|
|
} |
299
|
|
|
|
300
|
1 |
|
if (!$this->testsDirectory) { |
301
|
|
|
throw new \InvalidArgumentException('You must configure a tests directory.'); |
302
|
|
|
} |
303
|
|
|
|
304
|
1 |
|
if (!$this->phpunitPath) { |
305
|
|
|
throw new \InvalidArgumentException('You must configure a phpunit path.'); |
306
|
|
|
} |
307
|
|
|
|
308
|
1 |
|
return true; |
309
|
|
|
} |
310
|
|
|
} |
311
|
|
|
|
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.