guard-phpunit2 0.2.3 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +5 -1
  4. data/README.md +16 -7
  5. data/lib/guard/phpunit/formatters/PHPUnit-Progress/PHPUnit/Extensions/Progress/ResultPrinter.php +503 -0
  6. data/lib/guard/phpunit/formatters/PHPUnit-Progress/README.markdown +44 -0
  7. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/_files/Number.php +78 -0
  8. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/_files/NumberTest.php +99 -0
  9. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/_files/emptyTest.php +6 -0
  10. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_basic.phpt +22 -0
  11. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_errors.phpt +27 -0
  12. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_errors_variation.phpt +28 -0
  13. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_failing.phpt +31 -0
  14. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_failing_variation.phpt +32 -0
  15. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_incomplete.phpt +19 -0
  16. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_incomplete_variation.phpt +20 -0
  17. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_passing.phpt +19 -0
  18. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_passing_variation.phpt +20 -0
  19. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_skipped.phpt +19 -0
  20. data/lib/guard/phpunit/formatters/PHPUnit-Progress/Tests/printer_skipped_variation.phpt +20 -0
  21. data/lib/guard/phpunit/formatters/PHPUnit-Progress/VERSION +2 -0
  22. data/lib/guard/phpunit/formatters/PHPUnit-Progress/phpunit.xml +4 -0
  23. data/lib/guard/phpunit/formatters/PHPUnit-Progress/screenshot.png +0 -0
  24. data/lib/guard/phpunit2/formatter.rb +12 -9
  25. data/lib/guard/phpunit2/notifier.rb +1 -1
  26. data/lib/guard/phpunit2/runner.rb +25 -12
  27. data/lib/guard/phpunit2/version.rb +2 -2
  28. data/lib/guard/phpunit2.rb +1 -0
  29. data/spec/guard/phpunit2/formatter_spec.rb +4 -4
  30. data/spec/guard/phpunit2/notifier_spec.rb +4 -4
  31. data/spec/guard/phpunit2/runner_spec.rb +11 -3
  32. data/spec/guard/phpunit2_spec.rb +4 -0
  33. data.tar.gz.sig +0 -0
  34. metadata +74 -24
  35. metadata.gz.sig +2 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29049fcae5b8a04752ba78a2a8e4b99299fa282e
4
- data.tar.gz: 5d74a651906f7d51085ca82faf7b0211a0967464
3
+ metadata.gz: 0f96efc03dc54e656212472d776a045c5ad5268e
4
+ data.tar.gz: ea337d8a51a8ba57c5b5d53101ff0b0fc45be8a6
5
5
  SHA512:
6
- metadata.gz: a274812dc59206fc0f1edc7f2c7c654e35868477e989c513d29becd82f62f2a1c21ecb9eb69c64caa99a553a6513da9d5ccb2850cf4a43c4727c8bcb47a0e140
7
- data.tar.gz: d7a39c5e0467acb4ae0a2298d5f4a4d12848e14ea1c11fc0411a3fee756c610e534613204678ffbe4f557e6fcd8686069ebda77550f865188ea8885e2cb8c3c2
6
+ metadata.gz: 3001101cc7c940c0bbd5a00ea95837c56c6b2f5e47c6b2cf20b91b5a6b5a3a6c86289b13cda46dc0e7ed86131763e4c735da3aebf158648dc9d276c7d9098b47
7
+ data.tar.gz: 481ecdda28ef0f20f106797adb443f5c0820de6d8bdfd756ab91734c3db4f8f84952a54d0b26c2132f2163e7cd1e27b508aa283c92c4d8fcaa7b23f4427df392
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.1.5 - June 02, 2013
2
+ - Fixed issues with providing the command
3
+ - Made it include an explicit output formatter
4
+
1
5
  ## 0.1.4 - August 09, 2012
2
6
 
3
7
  - [#2][]: Add support for Windows.
@@ -34,4 +38,4 @@
34
38
 
35
39
  <!--- The following link definition list is generated by PimpMyChangelog --->
36
40
  [#2]: https://github.com/Maher4Ever/guard-phpunit/issues/2
37
- [#3]: https://github.com/Maher4Ever/guard-phpunit/issues/3
41
+ [#3]: https://github.com/Maher4Ever/guard-phpunit/issues/3
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- Guard::PHPUnit [![Build Status](https://secure.travis-ci.org/Maher4Ever/guard-phpunit.png)](http://travis-ci.org/Maher4Ever/guard-phpunit) [![Dependency Status](https://gemnasium.com/Maher4Ever/guard-phpunit.png?branch=master)](https://gemnasium.com/Maher4Ever/guard-phpunit)
1
+ Guard::PHPUnit [![Build Status](https://secure.travis-ci.org/ramon/guard-phpunit2.png)](http://travis-ci.org/ramon/guard-phpunit2)
2
2
  ==============
3
3
 
4
- Guard-phpunit allows you to automatically run [PHPUnit][6] tests when sources
4
+ Guard-phpunit2 allows you to automatically run [PHPUnit][6] tests when sources
5
5
  are modified. It helps with integrating test-driven development (TDD) into
6
6
  your development process: Just launch guard-phpunit before you start working
7
7
  and it will notify you about the status of your tests!
@@ -18,10 +18,10 @@ you proceed with the installation.
18
18
  The latest versions of [Ruby][1] come with a packages-manager called `gem`. `gem` can be used to
19
19
  install various packages, including guard-phpunit.
20
20
 
21
- To install guard-phpunit, run the following command in the terminal:
21
+ To install guard-phpunit2, run the following command in the terminal:
22
22
 
23
23
  ```shell
24
- $ gem install guard-phpunit
24
+ $ gem install guard-phpunit2
25
25
  ```
26
26
 
27
27
  Usage
@@ -48,7 +48,7 @@ An example of the Guardfile for the same project would look
48
48
  something like:
49
49
 
50
50
  ```ruby
51
- guard 'phpunit', :tests_path => 'Tests', :cli => '--colors' do
51
+ guard 'phpunit2', :tests_path => 'Tests', :cli => '--colors' do
52
52
  # Watch tests files
53
53
  watch(%r{^.+Test\.php$})
54
54
 
@@ -82,13 +82,17 @@ The following options can be passed to Guard::PHPUnit:
82
82
  :cli => '--colors' # The options passed to the phpunit command
83
83
  # when running the tests.
84
84
  # default: nil
85
+
86
+ :command => "./bin/phpunit" # specify alternative phpunit location
87
+ # that is not on the path.
88
+ # Useful if running phpunit from composer
85
89
  ```
86
90
 
87
91
  Development
88
92
  -----------
89
93
 
90
- * Source hosted at [GitHub](https://github.com/Maher4Ever/guard-phpunit)
91
- * Report issues/Questions/Feature requests on [GitHub Issues](https://github.com/Maher4Ever/guard-phpunit/issues)
94
+ * Source hosted at [GitHub](https://github.com/ramon/guard-phpunit2)
95
+ * Report issues/Questions/Feature requests on [GitHub Issues](https://github.com/ramon/guard-phpunit2/issues)
92
96
 
93
97
  Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change
94
98
  you make.
@@ -98,6 +102,11 @@ Author
98
102
 
99
103
  [Maher Sallam](https://github.com/Maher4Ever)
100
104
 
105
+ [Ramon Soares](https://github.com/ramon)
106
+
107
+ [Marek Kalnik](https://github.com/marekkalnik)
108
+
109
+
101
110
  [1]:http://ruby-lang.org
102
111
  [3]:https://github.com/guard/guard#readme
103
112
  [4]:http://www.phpunit.de/manual/current/en/
@@ -0,0 +1,503 @@
1
+ <?php
2
+
3
+ /**
4
+ * Prints tests' results in a similar way
5
+ * to rspec's progress formatter.
6
+ *
7
+ * @package PHPUnit
8
+ * @subpackage Progress
9
+ * @author Maher Sallam <maher@sallam.me>
10
+ * @copyright 2011 Maher Sallam <maher@sallam.me>
11
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
12
+ * @version 0.1
13
+ */
14
+ class PHPUnit_Extensions_Progress_ResultPrinter extends PHPUnit_TextUI_ResultPrinter {
15
+
16
+ /**
17
+ * Constructor.
18
+ *
19
+ * @param mixed $out
20
+ * @param boolean $verbose
21
+ * @param boolean $colors
22
+ * @param boolean $debug
23
+ */
24
+ public function __construct($out = NULL, $verbose = FALSE, $colors = FALSE, $debug = FALSE) {
25
+
26
+ // Start capturing output
27
+ ob_start();
28
+
29
+ $argv = $_SERVER['argv'];
30
+ $colors = in_array('--colors', $argv) || $colors;
31
+ $verbose = in_array('--verbose', $argv) || in_array('-v', $argv) || $verbose;
32
+ $debug = in_array('--debug', $argv) || $debug;
33
+
34
+ parent::__construct($out, $verbose, $colors, $debug);
35
+ }
36
+
37
+ /**
38
+ * @param PHPUnit_Framework_TestResult $result
39
+ */
40
+ public function printResult(PHPUnit_Framework_TestResult $result)
41
+ {
42
+ print "\n";
43
+
44
+ if ($result->errorCount() > 0) {
45
+ $this->printErrors($result);
46
+ }
47
+
48
+ if ($result->failureCount() > 0) {
49
+ $this->printFailures($result);
50
+ }
51
+
52
+ if ($this->verbose) {
53
+ if ($result->deprecatedFeaturesCount() > 0) {
54
+ if ($result->failureCount() > 0) {
55
+ print "\n--\n\nDeprecated PHPUnit features are being used";
56
+ }
57
+
58
+ foreach ($result->deprecatedFeatures() as $deprecatedFeature) {
59
+ $this->write($deprecatedFeature . "\n\n");
60
+ }
61
+ }
62
+
63
+ if ($result->notImplementedCount() > 0) {
64
+ $this->printIncompletes($result);
65
+ }
66
+
67
+ if ($result->skippedCount() > 0) {
68
+ $this->printSkipped($result);
69
+ }
70
+ }
71
+
72
+ $this->printFooter($result);
73
+ }
74
+
75
+ /**
76
+ * @param array $defects
77
+ * @param integer $count
78
+ * @param string $type
79
+ */
80
+ protected function printDefects(array $defects, $count, $type)
81
+ {
82
+ if ($count == 0) {
83
+ return;
84
+ }
85
+
86
+ $this->write("\n" . $type . ":\n");
87
+
88
+ $i = 1;
89
+ $failOrError = $type == 'Failures' || $type == 'Errors';
90
+
91
+ foreach ($defects as $defect) {
92
+ $this->printDefect($defect, $i++, $failOrError);
93
+ $this->write("\n");
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @param PHPUnit_Framework_TestFailure $defect
99
+ * @param integer $count
100
+ * @param boolean $failOrError
101
+ */
102
+ protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count, $failOrError = true)
103
+ {
104
+ $this->printDefectHeader($defect, $count, $failOrError);
105
+
106
+ $padding = str_repeat(' ',
107
+ 4 + ( $failOrError ? strlen((string)$count) : 0 )
108
+ );
109
+
110
+ $this->printDefectBody($defect, $count, $failOrError, $padding);
111
+ $this->printDefectTrace($defect, $padding);
112
+ }
113
+
114
+ /**
115
+ * @param PHPUnit_Framework_TestFailure $defect
116
+ * @param integer $count
117
+ * @param boolean $failOrError
118
+ */
119
+ protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count, $failOrError = true)
120
+ {
121
+ $failedTest = $defect->failedTest();
122
+
123
+ if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) {
124
+ $testName = $failedTest->toString();
125
+ } else {
126
+ $testName = get_class($failedTest);
127
+ }
128
+
129
+ if ( $failOrError ) {
130
+ $this->write(
131
+ sprintf(
132
+ "\n %d) %s",
133
+
134
+ $count,
135
+ $testName
136
+ )
137
+ );
138
+ } else {
139
+ $this->write(
140
+ sprintf( " %s", $this->yellow($testName) )
141
+ );
142
+ }
143
+ }
144
+
145
+ /**
146
+ * @param PHPUnit_Framework_TestFailure $defect
147
+ * @param integer $count
148
+ * @param boolean $failOrError
149
+ * @param string $padding
150
+ */
151
+ protected function printDefectBody(PHPUnit_Framework_TestFailure $defect, $count, $failOrError, $padding)
152
+ {
153
+ $error = trim($defect->getExceptionAsString());
154
+
155
+ if ( !empty($error) ) {
156
+ $error = explode("\n", $error);
157
+ $error = "\n" . $padding . implode("\n " . $padding , $error);
158
+
159
+ $this->write( $failOrError ? $this->red($error) : $this->cyan($error) );
160
+ }
161
+ }
162
+
163
+ /**
164
+ * @param PHPUnit_Framework_TestFailure $defect
165
+ * @param string $padding
166
+ */
167
+ protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect, $padding = 0)
168
+ {
169
+ $trace = trim(
170
+ PHPUnit_Util_Filter::getFilteredStacktrace(
171
+ $defect->thrownException()
172
+ )
173
+ );
174
+
175
+ if ( ! empty($trace) ) {
176
+ $trace = explode("\n", $trace);
177
+ $trace = "\n" . $padding . '# ' . implode("\n${padding}# ", $trace);
178
+
179
+ $this->write($this->cyan($trace));
180
+ }
181
+ }
182
+
183
+ /**
184
+ * @param PHPUnit_Framework_TestResult $result
185
+ */
186
+ protected function printErrors(PHPUnit_Framework_TestResult $result)
187
+ {
188
+ $this->printDefects(
189
+ $result->errors(),
190
+ $result->errorCount(),
191
+ 'Errors'
192
+ );
193
+ }
194
+
195
+ /**
196
+ * @param PHPUnit_Framework_TestResult $result
197
+ */
198
+ protected function printFailures(PHPUnit_Framework_TestResult $result)
199
+ {
200
+ $this->printDefects(
201
+ $result->failures(),
202
+ $result->failureCount(),
203
+ 'Failures'
204
+ );
205
+ }
206
+
207
+ /**
208
+ * @param PHPUnit_Framework_TestResult $result
209
+ */
210
+ protected function printIncompletes(PHPUnit_Framework_TestResult $result)
211
+ {
212
+ $this->printDefects(
213
+ $result->notImplemented(),
214
+ $result->notImplementedCount(),
215
+ 'Incomplete tests'
216
+ );
217
+ }
218
+
219
+ /**
220
+ * @param PHPUnit_Framework_TestResult $result
221
+ * @since Method available since Release 3.0.0
222
+ */
223
+ protected function printSkipped(PHPUnit_Framework_TestResult $result)
224
+ {
225
+ $this->printDefects(
226
+ $result->skipped(),
227
+ $result->skippedCount(),
228
+ 'Skipped tests'
229
+ );
230
+ }
231
+
232
+ /**
233
+ * @param PHPUnit_Framework_TestResult $result
234
+ */
235
+ protected function printFooter(PHPUnit_Framework_TestResult $result)
236
+ {
237
+
238
+ $this->write( sprintf("\nFinished in %s\n", PHP_Timer::timeSinceStartOfRequest()) );
239
+
240
+ $resultsCount = count($result);
241
+
242
+ $footer = sprintf("%d test%s, %d assertion%s",
243
+ $resultsCount,
244
+ $resultsCount == 1 ? '' : 's',
245
+ $this->numAssertions,
246
+ $this->numAssertions == 1 ? '' : 's'
247
+ );
248
+
249
+ // backwards/forwards compatibility hack for naming fix from phpunit 3.7.11
250
+ // @see https://github.com/sebastianbergmann/phpunit/issues/762
251
+ $allCompletelyImplemented = method_exists($result, 'allCompletelyImplemented')?
252
+ 'allCompletelyImplemented':'allCompletlyImplemented';
253
+
254
+ if ( $result->wasSuccessful() &&
255
+ $result->$allCompletelyImplemented() &&
256
+ $result->noneSkipped() )
257
+ {
258
+ $this->write($this->green($footer));
259
+ }
260
+
261
+ else if ( ( !$result->$allCompletelyImplemented() || !$result->noneSkipped() )
262
+ &&
263
+ $result->wasSuccessful() )
264
+ {
265
+
266
+ $footer .= sprintf(
267
+ "%s%s",
268
+
269
+ $this->getCountString(
270
+ $result->notImplementedCount(), 'incomplete'
271
+ ),
272
+ $this->getCountString(
273
+ $result->skippedCount(), 'skipped'
274
+ )
275
+ );
276
+
277
+ $this->write($this->yellow($footer));
278
+
279
+ }
280
+
281
+ else {
282
+
283
+ $footer .= sprintf(
284
+ "%s%s%s%s",
285
+
286
+ $this->getCountString($result->failureCount(), 'failures'),
287
+ $this->getCountString($result->errorCount(), 'errors'),
288
+ $this->getCountString(
289
+ $result->notImplementedCount(), 'incomplete'
290
+ ),
291
+ $this->getCountString($result->skippedCount(), 'skipped')
292
+ );
293
+
294
+ $footer = preg_replace('/,$/', '', $footer);
295
+
296
+ $this->write($this->red($footer));
297
+ }
298
+
299
+ if ( ! $this->verbose &&
300
+ $result->deprecatedFeaturesCount() > 0 )
301
+ {
302
+ $message = sprintf(
303
+ "Warning: Deprecated PHPUnit features are being used %s times!\n".
304
+ "Use --verbose for more information.\n",
305
+ $result->deprecatedFeaturesCount()
306
+ );
307
+
308
+ if ($this->colors) {
309
+ $message = "\x1b[37;41m\x1b[2K" . $message .
310
+ "\x1b[0m";
311
+ }
312
+
313
+ $this->write("\n" . $message);
314
+ }
315
+
316
+ $this->writeNewLine();
317
+ }
318
+
319
+ /**
320
+ * @param integer $count
321
+ * @param string $name
322
+ * @return string
323
+ * @since Method available since Release 3.0.0
324
+ */
325
+ protected function getCountString($count, $name)
326
+ {
327
+ $string = '';
328
+
329
+ if ($count > 0) {
330
+ $string = sprintf(
331
+ ', %d %s',
332
+
333
+ $count,
334
+ $name
335
+ );
336
+ }
337
+
338
+ return $string;
339
+ }
340
+
341
+ /**
342
+ * An error occurred.
343
+ *
344
+ * @param PHPUnit_Framework_Test $test
345
+ * @param Exception $e
346
+ * @param float $time
347
+ */
348
+ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
349
+ {
350
+ $this->writeProgress($this->red('E'));
351
+ $this->lastTestFailed = TRUE;
352
+ }
353
+
354
+ /**
355
+ * A failure occurred.
356
+ *
357
+ * @param PHPUnit_Framework_Test $test
358
+ * @param PHPUnit_Framework_AssertionFailedError $e
359
+ * @param float $time
360
+ */
361
+ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
362
+ {
363
+ $this->writeProgress($this->red('F'));
364
+ $this->lastTestFailed = TRUE;
365
+ }
366
+
367
+ /**
368
+ * Incomplete test.
369
+ *
370
+ * @param PHPUnit_Framework_Test $test
371
+ * @param Exception $e
372
+ * @param float $time
373
+ */
374
+ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
375
+ {
376
+ $this->writeProgress($this->yellow('I'));
377
+ $this->lastTestFailed = TRUE;
378
+ }
379
+
380
+ /**
381
+ * Skipped test.
382
+ *
383
+ * @param PHPUnit_Framework_Test $test
384
+ * @param Exception $e
385
+ * @param float $time
386
+ * @since Method available since Release 3.0.0
387
+ */
388
+ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
389
+ {
390
+ $this->writeProgress($this->yellow('S'));
391
+ $this->lastTestFailed = TRUE;
392
+ }
393
+
394
+ /**
395
+ * A test ended.
396
+ *
397
+ * @param PHPUnit_Framework_Test $test
398
+ * @param float $time
399
+ */
400
+ public function endTest(PHPUnit_Framework_Test $test, $time)
401
+ {
402
+ if (!$this->lastTestFailed) {
403
+ $this->writeProgress($this->green('.'));
404
+ }
405
+
406
+ if ($test instanceof PHPUnit_Framework_TestCase) {
407
+ $this->numAssertions += $test->getNumAssertions();
408
+ }
409
+
410
+ else if ($test instanceof PHPUnit_Extensions_PhptTestCase) {
411
+ $this->numAssertions++;
412
+ }
413
+
414
+ $this->lastTestFailed = FALSE;
415
+
416
+ if ($this->verbose && $test instanceof PHPUnit_Framework_TestCase) {
417
+ $this->write($test->getActualOutput());
418
+ }
419
+
420
+ }
421
+
422
+ /**
423
+ * @param string $progress
424
+ */
425
+ protected function writeProgress($progress)
426
+ {
427
+ static $deletedHeader = false;
428
+
429
+ if ( ! $deletedHeader ) {
430
+ ob_clean();
431
+ $deletedHeader = true;
432
+ }
433
+
434
+ parent::writeProgress($progress);
435
+ }
436
+
437
+ /**
438
+ * Returns a colored string which can be used
439
+ * in the terminal.
440
+ *
441
+ * @param string $text
442
+ * @param integer $color_code
443
+ */
444
+ protected function color($text, $color_code) {
445
+ return $this->colors ? "\033[${color_code}m" . $text . "\033[0m" : $text;
446
+ }
447
+
448
+ /**
449
+ * @param string $text
450
+ */
451
+ protected function bold($text) {
452
+ return $this->color($text, "1");
453
+ }
454
+
455
+ /**
456
+ * @param string $text
457
+ */
458
+ protected function red($text) {
459
+ return $this->color($text, "31");
460
+ }
461
+
462
+ /**
463
+ * @param string $text
464
+ */
465
+ protected function green($text) {
466
+ return $this->color($text, "32");
467
+ }
468
+
469
+ /**
470
+ * @param string $text
471
+ */
472
+ protected function yellow($text) {
473
+ return $this->color($text, "33");
474
+ }
475
+
476
+ /**
477
+ * @param string $text
478
+ */
479
+ protected function blue($text) {
480
+ return $this->color($text, "34");
481
+ }
482
+
483
+ /**
484
+ * @param string $text
485
+ */
486
+ protected function magenta($text) {
487
+ return $this->color($text, "35");
488
+ }
489
+
490
+ /**
491
+ * @param string $text
492
+ */
493
+ protected function cyan($text) {
494
+ return $this->color($text, "36");
495
+ }
496
+
497
+ /**
498
+ * @param string $text
499
+ */
500
+ protected function white($text) {
501
+ return $this->color($text, "37");
502
+ }
503
+ }