1 | <?php |
||
2 | |||
3 | declare (strict_types=1); |
||
4 | namespace HumbugBox451\KevinGH\RequirementChecker; |
||
5 | |||
6 | use InvalidArgumentException; |
||
7 | use function count; |
||
8 | use function sprintf; |
||
9 | /** @internal */ |
||
10 | final class Checker |
||
11 | { |
||
12 | private static $requirementsConfig; |
||
13 | public static function checkRequirements() : bool |
||
14 | { |
||
15 | $requirements = self::retrieveRequirements(); |
||
16 | $checkPassed = $requirements->evaluateRequirements(); |
||
17 | $io = new IO(); |
||
18 | self::printCheck($checkPassed, new Printer($io->getVerbosity(), $io->hasColorSupport()), $requirements); |
||
19 | return $checkPassed; |
||
20 | } |
||
21 | public static function printCheck($checkPassed, Printer $printer, RequirementCollection $requirements) : void |
||
22 | { |
||
23 | if (\false === $checkPassed && IO::VERBOSITY_VERY_VERBOSE > $printer->getVerbosity()) { |
||
24 | $printer->setVerbosity(IO::VERBOSITY_VERY_VERBOSE); |
||
25 | } |
||
26 | $verbosity = IO::VERBOSITY_VERY_VERBOSE; |
||
27 | $iniPath = $requirements->getPhpIniPath(); |
||
28 | $printer->title('Box Requirements Checker', $verbosity); |
||
29 | $printer->printv('> Using PHP ', $verbosity); |
||
30 | $printer->printvln(\PHP_VERSION, $verbosity, 'green'); |
||
31 | if ($iniPath) { |
||
32 | $printer->printvln('> PHP is using the following php.ini file:', $verbosity); |
||
33 | $printer->printvln(' ' . $iniPath, $verbosity, 'green'); |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
34 | } else { |
||
35 | $printer->printvln('> PHP is not using any php.ini file.', $verbosity, 'yellow'); |
||
36 | } |
||
37 | $printer->printvln('', $verbosity); |
||
38 | if (count($requirements) > 0) { |
||
39 | $printer->printvln('> Checking Box requirements:', $verbosity); |
||
40 | $printer->printv(' ', $verbosity); |
||
41 | } else { |
||
42 | $printer->printvln('> No requirements found.', $verbosity); |
||
43 | } |
||
44 | $errorMessages = []; |
||
45 | foreach ($requirements->getRequirements() as $requirement) { |
||
46 | if ($errorMessage = $printer->getRequirementErrorMessage($requirement)) { |
||
47 | if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { |
||
48 | $printer->printvln('✘ ' . $requirement->getTestMessage(), IO::VERBOSITY_DEBUG, 'red'); |
||
49 | $printer->printv(' ', IO::VERBOSITY_DEBUG); |
||
50 | $errorMessages[] = $errorMessage; |
||
51 | } else { |
||
52 | $printer->printv('E', $verbosity, 'red'); |
||
53 | $errorMessages[] = $errorMessage; |
||
54 | } |
||
55 | continue; |
||
56 | } |
||
57 | if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { |
||
58 | $printer->printvln('✔ ' . $requirement->getTestMessage(), IO::VERBOSITY_DEBUG, 'green'); |
||
59 | $printer->printv(' ', IO::VERBOSITY_DEBUG); |
||
60 | } else { |
||
61 | $printer->printv('.', $verbosity, 'green'); |
||
62 | } |
||
63 | } |
||
64 | if (IO::VERBOSITY_DEBUG !== $printer->getVerbosity() && count($requirements) > 0) { |
||
65 | $printer->printvln('', $verbosity); |
||
66 | } |
||
67 | if ($requirements->evaluateRequirements()) { |
||
68 | $printer->block('OK', 'Your system is ready to run the application.', $verbosity, 'success'); |
||
69 | } else { |
||
70 | $printer->block('ERROR', 'Your system is not ready to run the application.', $verbosity, 'error'); |
||
71 | $printer->title('Fix the following mandatory requirements:', $verbosity, 'red'); |
||
72 | foreach ($errorMessages as $errorMessage) { |
||
73 | $printer->printv(' * ' . $errorMessage, $verbosity); |
||
74 | } |
||
75 | } |
||
76 | $printer->printvln('', $verbosity); |
||
77 | } |
||
78 | private static function retrieveRequirements() : RequirementCollection |
||
79 | { |
||
80 | if (null === self::$requirementsConfig) { |
||
81 | self::$requirementsConfig = __DIR__ . '/../.requirements.php'; |
||
82 | } |
||
83 | $config = (require self::$requirementsConfig); |
||
84 | $requirements = new RequirementCollection(); |
||
85 | foreach ($config as $constraint) { |
||
86 | $requirements->addRequirement(self::createCondition($constraint['type'], $constraint['condition']), $constraint['message'], $constraint['helpMessage']); |
||
87 | } |
||
88 | return $requirements; |
||
89 | } |
||
90 | private static function createCondition($type, $condition) : IsFulfilled |
||
91 | { |
||
92 | switch ($type) { |
||
93 | case 'php': |
||
94 | return new IsPhpVersionFulfilled($condition); |
||
95 | case 'extension': |
||
96 | return new IsExtensionFulfilled($condition); |
||
97 | case 'extension-conflict': |
||
98 | return new IsExtensionConflictFulfilled($condition); |
||
99 | default: |
||
100 | throw new InvalidArgumentException(sprintf('Unknown requirement type "%s".', $type)); |
||
101 | } |
||
102 | } |
||
103 | } |
||
104 |