Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
95.00% |
19 / 20 |
|
100.00% |
8 / 8 |
CRAP | |
100.00% |
1 / 1 |
VariableHolder | |
100.00% |
19 / 19 |
|
100.00% |
8 / 8 |
14 | |
100.00% |
1 / 1 |
newFromArray | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
setVar | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
3 | |||
getVars | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setLazyLoadVar | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
getVarThrow | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
getComputedVariable | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
addHolders | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
2 | |||
varIsSet | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
removeVar | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\AbuseFilter\Variables; |
4 | |
5 | use MediaWiki\Extension\AbuseFilter\Parser\AFPData; |
6 | |
7 | /** |
8 | * Mutable value object that holds a list of variables |
9 | */ |
10 | class VariableHolder { |
11 | /** |
12 | * @var (AFPData|LazyLoadedVariable)[] |
13 | */ |
14 | private $mVars = []; |
15 | |
16 | /** |
17 | * Utility function to translate an array with shape [ varname => value ] into a self instance |
18 | * |
19 | * @param array $vars |
20 | * @return VariableHolder |
21 | */ |
22 | public static function newFromArray( array $vars ): VariableHolder { |
23 | $ret = new self(); |
24 | foreach ( $vars as $var => $value ) { |
25 | $ret->setVar( $var, $value ); |
26 | } |
27 | return $ret; |
28 | } |
29 | |
30 | /** |
31 | * @param string $variable |
32 | * @param mixed $datum |
33 | */ |
34 | public function setVar( string $variable, $datum ): void { |
35 | $variable = strtolower( $variable ); |
36 | if ( !( $datum instanceof AFPData || $datum instanceof LazyLoadedVariable ) ) { |
37 | $datum = AFPData::newFromPHPVar( $datum ); |
38 | } |
39 | |
40 | $this->mVars[$variable] = $datum; |
41 | } |
42 | |
43 | /** |
44 | * Get all variables stored in this object |
45 | * |
46 | * @return (AFPData|LazyLoadedVariable)[] |
47 | */ |
48 | public function getVars(): array { |
49 | return $this->mVars; |
50 | } |
51 | |
52 | /** |
53 | * @param string $variable |
54 | * @param string $method |
55 | * @param array $parameters |
56 | */ |
57 | public function setLazyLoadVar( string $variable, string $method, array $parameters ): void { |
58 | $placeholder = new LazyLoadedVariable( $method, $parameters ); |
59 | $this->setVar( $variable, $placeholder ); |
60 | } |
61 | |
62 | /** |
63 | * Get a variable from the current object, or throw if not set |
64 | * |
65 | * @param string $varName The variable name |
66 | * @return AFPData|LazyLoadedVariable |
67 | */ |
68 | public function getVarThrow( string $varName ) { |
69 | $varName = strtolower( $varName ); |
70 | if ( !$this->varIsSet( $varName ) ) { |
71 | throw new UnsetVariableException( $varName ); |
72 | } |
73 | return $this->mVars[$varName]; |
74 | } |
75 | |
76 | /** |
77 | * A stronger version of self::getVarThrow that also asserts that the variable was computed |
78 | * @param string $varName |
79 | * @return AFPData |
80 | * @codeCoverageIgnore |
81 | */ |
82 | public function getComputedVariable( string $varName ): AFPData { |
83 | return $this->getVarThrow( $varName ); |
84 | } |
85 | |
86 | /** |
87 | * Merge any number of holders given as arguments into this holder. |
88 | * |
89 | * @param VariableHolder ...$holders |
90 | */ |
91 | public function addHolders( VariableHolder ...$holders ): void { |
92 | foreach ( $holders as $addHolder ) { |
93 | $this->mVars = array_merge( $this->mVars, $addHolder->mVars ); |
94 | } |
95 | } |
96 | |
97 | /** |
98 | * @param string $var |
99 | * @return bool |
100 | */ |
101 | public function varIsSet( string $var ): bool { |
102 | return array_key_exists( $var, $this->mVars ); |
103 | } |
104 | |
105 | /** |
106 | * @param string $varName |
107 | */ |
108 | public function removeVar( string $varName ): void { |
109 | unset( $this->mVars[$varName] ); |
110 | } |
111 | } |
112 | |
113 | // @deprecated Since 1.36. Kept for BC with the UpdateVarDumps script, see T331861. The alias can be removed |
114 | // once we no longer support updating from a MW version where that script may run. |
115 | class_alias( VariableHolder::class, 'AbuseFilterVariableHolder' ); |