Whip_RequirementsChecker.php
4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?php
/**
* WHIP libary file.
*
* @package Yoast\WHIP
*/
/**
* Main controller class to require a certain version of software.
*/
class Whip_RequirementsChecker {
/**
* Requirements the environment should comply with.
*
* @var array
*/
private $requirements;
/**
* The text domain to use for translations.
*
* @var string
*/
private $textdomain;
/**
* Whip_RequirementsChecker constructor.
*
* @param array $configuration The configuration to check.
* @param string $textdomain The text domain to use for translations.
*
* @throws Whip_InvalidType When the $configuration parameter is not of the expected type.
*/
public function __construct( $configuration = array(), $textdomain = 'default' ) {
$this->requirements = array();
$this->configuration = new Whip_Configuration( $configuration );
$this->messageManager = new Whip_MessagesManager();
$this->textdomain = $textdomain;
}
/**
* Adds a requirement to the list of requirements if it doesn't already exist.
*
* @param Whip_Requirement $requirement The requirement to add.
*/
public function addRequirement( Whip_Requirement $requirement ) {
// Only allow unique entries to ensure we're not checking specific combinations multiple times.
if ( $this->requirementExistsForComponent( $requirement->component() ) ) {
return;
}
$this->requirements[] = $requirement;
}
/**
* Determines whether or not there are requirements available.
*
* @return bool Whether or not there are requirements.
*/
public function hasRequirements() {
return $this->totalRequirements() > 0;
}
/**
* Gets the total amount of requirements.
*
* @return int The total amount of requirements.
*/
public function totalRequirements() {
return count( $this->requirements );
}
/**
* Determines whether or not a requirement exists for a particular component.
*
* @param string $component The component to check for.
*
* @return bool Whether or not the component has a requirement defined.
*/
public function requirementExistsForComponent( $component ) {
foreach ( $this->requirements as $requirement ) {
if ( $requirement->component() === $component ) {
return true;
}
}
return false;
}
/**
* Determines whether a requirement has been fulfilled.
*
* @param Whip_Requirement $requirement The requirement to check.
*
* @return bool Whether or not the requirement is fulfilled.
*/
private function requirementIsFulfilled( Whip_Requirement $requirement ) {
$availableVersion = $this->configuration->configuredVersion( $requirement );
$requiredVersion = $requirement->version();
if ( in_array( $requirement->operator(), array( '=', '==', '===' ), true ) ) {
return version_compare( $availableVersion, $requiredVersion, '>=' );
}
return version_compare( $availableVersion, $requiredVersion, $requirement->operator() );
}
/**
* Checks if all requirements are fulfilled and adds a message to the message manager if necessary.
*/
public function check() {
foreach ( $this->requirements as $requirement ) {
// Match against config.
$requirementFulfilled = $this->requirementIsFulfilled( $requirement );
if ( $requirementFulfilled ) {
continue;
}
$this->addMissingRequirementMessage( $requirement );
}
}
/**
* Adds a message to the message manager for requirements that cannot be fulfilled.
*
* @param Whip_Requirement $requirement The requirement that cannot be fulfilled.
*/
private function addMissingRequirementMessage( Whip_Requirement $requirement ) {
switch ( $requirement->component() ) {
case 'php':
$this->messageManager->addMessage( new Whip_UpgradePhpMessage( $this->textdomain ) );
break;
default:
$this->messageManager->addMessage( new Whip_InvalidVersionRequirementMessage( $requirement, $this->configuration->configuredVersion( $requirement ) ) );
break;
}
}
/**
* Determines whether or not there are messages available.
*
* @return bool Whether or not there are messages to display.
*/
public function hasMessages() {
return $this->messageManager->hasMessages();
}
/**
* Gets the most recent message from the message manager.
*
* @return Whip_Message The latest message.
*/
public function getMostRecentMessage() {
return $this->messageManager->getLatestMessage();
}
}