Skip to content

Commit 126283e

Browse files
committed
Merge pull request #145 from wmde/test-php-versions
Test with actively supported PHP versions
2 parents 4bb3d80 + a998c3b commit 126283e

39 files changed

+1254
-1299
lines changed

.github/workflows/push.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: ubuntu-latest
88
strategy:
99
matrix:
10-
php_version: [ '7.2', '7.3', '7.4', '8.0', '8.1' ]
10+
php_version: [ '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ]
1111
steps:
1212
- uses: actions/checkout@v4
1313
- name: Setup PHP

composer.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424
"irc": "irc://irc.freenode.net/wikimedia-de-tech"
2525
},
2626
"require": {
27-
"php": ">=7.2"
27+
"php": ">=7.4"
2828
},
2929
"require-dev": {
3030
"phpunit/phpunit": "~8.5.0",
31-
"squizlabs/php_codesniffer": "~3.6.0",
32-
"ockcyp/covers-validator": "~1.0"
31+
"ockcyp/covers-validator": "~1.0",
32+
"mediawiki/mediawiki-codesniffer": "^45"
3333
},
3434
"autoload": {
3535
"files" : [
@@ -65,5 +65,10 @@
6565
"phpcs": [
6666
"vendor/bin/phpcs src/* tests/* --standard=phpcs.xml --extensions=php -sp"
6767
]
68+
},
69+
"config": {
70+
"allow-plugins": {
71+
"dealerdirect/phpcodesniffer-composer-installer": true
72+
}
6873
}
6974
}

phpcs.xml

Lines changed: 1 addition & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,5 @@
44
- https://github.com/squizlabs/PHP_CodeSniffer/tree/master/CodeSniffer/Standards
55
-->
66
<ruleset name="Diff">
7-
<rule ref="Generic.Classes" />
8-
<rule ref="Generic.CodeAnalysis" />
9-
<rule ref="Generic.ControlStructures" />
10-
11-
<rule ref="Generic.Files.ByteOrderMark" />
12-
<rule ref="Generic.Files.EndFileNewline" />
13-
<rule ref="Generic.Files.InlineHTML" />
14-
<rule ref="Generic.Files.LineEndings" />
15-
<rule ref="Generic.Files.LineLength">
16-
<properties>
17-
<property name="lineLimit" value="120" />
18-
<property name="absoluteLineLimit" value="120" />
19-
</properties>
20-
</rule>
21-
<rule ref="Generic.Files.OneClassPerFile" />
22-
<rule ref="Generic.Files.OneInterfacePerFile" />
23-
<rule ref="Generic.Files.OneTraitPerFile" />
24-
25-
<rule ref="Generic.Formatting.DisallowMultipleStatements" />
26-
27-
<rule ref="Generic.Functions.CallTimePassByReference" />
28-
<rule ref="Generic.Functions.FunctionCallArgumentSpacing" />
29-
<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" />
30-
31-
<rule ref="Generic.Metrics.NestingLevel">
32-
<properties>
33-
<property name="nestingLevel" value="3" />
34-
<property name="absoluteNestingLevel" value="3" />
35-
</properties>
36-
</rule>
37-
38-
<rule ref="Generic.Metrics.CyclomaticComplexity">
39-
<properties>
40-
<property name="complexity" value="10" />
41-
<property name="absoluteComplexity" value="10" />
42-
</properties>
43-
</rule>
44-
45-
<rule ref="Generic.NamingConventions">
46-
<exclude name="Generic.NamingConventions.AbstractClassNamePrefix"/>
47-
<exclude name="Generic.NamingConventions.InterfaceNameSuffix"/>
48-
</rule>
49-
<rule ref="Generic.NamingConventions.CamelCapsFunctionName.ScopeNotCamelCaps">
50-
<!-- Exclude test methods like "testGivenInvalidInput_methodThrowsException". -->
51-
<exclude-pattern>tests.unit*Test\.php</exclude-pattern>
52-
</rule>
53-
54-
<rule ref="Generic.PHP.CharacterBeforePHPOpeningTag" />
55-
<rule ref="Generic.PHP.DeprecatedFunctions" />
56-
<rule ref="Generic.PHP.DisallowShortOpenTag" />
57-
<rule ref="Generic.PHP.ForbiddenFunctions" />
58-
<rule ref="Generic.PHP.LowerCaseConstant" />
59-
<rule ref="Generic.PHP.LowerCaseKeyword" />
60-
<rule ref="Generic.PHP.NoSilencedErrors" />
61-
<rule ref="Generic.PHP.SAPIUsage" />
62-
63-
<rule ref="Generic.WhiteSpace.DisallowSpaceIndent" />
64-
65-
<rule ref="PSR1" />
66-
<rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">
67-
<!-- Exclude test methods like "testGivenInvalidInput_methodThrowsException". -->
68-
<exclude-pattern>tests.unit*Test\.php</exclude-pattern>
69-
</rule>
70-
71-
<rule ref="PSR2.Classes.PropertyDeclaration" />
72-
<rule ref="PSR2.ControlStructures.ElseIfDeclaration" />
73-
<rule ref="PSR2.Files" />
74-
<rule ref="PSR2.Namespaces" />
75-
76-
<rule ref="Squiz.Arrays.ArrayBracketSpacing" />
77-
<rule ref="Squiz.CSS.SemicolonSpacing" />
78-
<rule ref="Squiz.Classes.DuplicateProperty" />
79-
<rule ref="Squiz.Classes.SelfMemberReference" />
80-
<rule ref="Squiz.Classes.ValidClassName" />
81-
<rule ref="Squiz.Functions.FunctionDuplicateArgument" />
82-
<rule ref="Squiz.Functions.GlobalFunction" />
83-
<rule ref="Squiz.Scope" />
84-
85-
<rule ref="Squiz.Strings.DoubleQuoteUsage">
86-
<exclude name="Squiz.Strings.DoubleQuoteUsage.ContainsVar" />
87-
</rule>
88-
89-
<rule ref="Squiz.WhiteSpace.CastSpacing" />
90-
<rule ref="Squiz.WhiteSpace.LanguageConstructSpacing" />
91-
<rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing" />
92-
<rule ref="Squiz.WhiteSpace.FunctionSpacing">
93-
<properties>
94-
<property name="spacing" value="1" />
95-
</properties>
96-
</rule>
97-
<rule ref="Squiz.WhiteSpace.OperatorSpacing">
98-
<properties>
99-
<property name="ignoreNewlines" value="true" />
100-
</properties>
101-
</rule>
102-
<rule ref="Squiz.WhiteSpace.ScopeClosingBrace" />
103-
<rule ref="Squiz.WhiteSpace.ScopeKeywordSpacing" />
104-
<rule ref="Squiz.WhiteSpace.SemicolonSpacing" />
105-
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />
106-
107-
<rule ref="Zend.Files.ClosingTag" />
7+
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki" />
1088
</ruleset>

src/ArrayComparer/OrderedArrayComparer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
class OrderedArrayComparer implements ArrayComparer {
2323

24-
private $valueComparer;
24+
private ValueComparer $valueComparer;
2525

2626
public function __construct( ValueComparer $valueComparer ) {
2727
$this->valueComparer = $valueComparer;

src/ArrayComparer/StrategicArrayComparer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*/
2020
class StrategicArrayComparer implements ArrayComparer {
2121

22-
private $valueComparer;
22+
private ValueComparer $valueComparer;
2323

2424
public function __construct( ValueComparer $valueComparer ) {
2525
$this->valueComparer = $valueComparer;

src/Comparer/CallbackComparer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
class CallbackComparer implements ValueComparer {
1717

18+
/** @var callable */
1819
private $callback;
1920

2021
/**
@@ -26,6 +27,11 @@ public function __construct( $callback ) {
2627
$this->callback = $callback;
2728
}
2829

30+
/**
31+
* @param mixed $firstValue
32+
* @param mixed $secondValue
33+
* @return bool
34+
*/
2935
public function valuesAreEqual( $firstValue, $secondValue ): bool {
3036
$valuesAreEqual = call_user_func_array( $this->callback, [ $firstValue, $secondValue ] );
3137

src/Comparer/ComparableComparer.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
*/
1515
class ComparableComparer implements ValueComparer {
1616

17+
/**
18+
* @param mixed $firstValue
19+
* @param mixed $secondValue
20+
* @return bool
21+
*/
1722
public function valuesAreEqual( $firstValue, $secondValue ): bool {
1823
if ( $firstValue && method_exists( $firstValue, 'equals' ) ) {
1924
return $firstValue->equals( $secondValue );

src/DiffOp/Diff/Diff.php

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ public function __construct( array $operations = [], $isAssociative = null ) {
6565

6666
foreach ( $operations as $offset => $operation ) {
6767
if ( !( $operation instanceof DiffOp ) ) {
68-
throw new InvalidArgumentException( 'All elements fed to the Diff constructor should be of type DiffOp' );
68+
throw new InvalidArgumentException(
69+
'All elements fed to the Diff constructor should be of type DiffOp'
70+
);
6971
}
7072

7173
$this->offsetSet( $offset, $operation );
@@ -125,14 +127,17 @@ public function addOperations( array $operations ) {
125127
*/
126128
private function preSetElement( $index, DiffOp $value ): bool {
127129
if ( $this->isAssociative === false && ( $value->getType() !== 'add' && $value->getType() !== 'remove' ) ) {
128-
throw new InvalidArgumentException( 'Diff operation with invalid type "' . $value->getType() . '" provided.' );
130+
throw new InvalidArgumentException(
131+
'Diff operation with invalid type "' . $value->getType() . '" provided.'
132+
);
129133
}
130134

131135
if ( array_key_exists( $value->getType(), $this->typePointers ) ) {
132136
$this->typePointers[$value->getType()][] = $index;
133-
}
134-
else {
135-
throw new InvalidArgumentException( 'Diff operation with invalid type "' . $value->getType() . '" provided.' );
137+
} else {
138+
throw new InvalidArgumentException(
139+
'Diff operation with invalid type "' . $value->getType() . '" provided.'
140+
);
136141
}
137142

138143
return true;
@@ -147,7 +152,7 @@ private function preSetElement( $index, DiffOp $value ): bool {
147152
*/
148153
#[\ReturnTypeWillChange]
149154
public function unserialize( $serialization ) {
150-
$this->__unserialize( unserialize( $serialization) );
155+
$this->__unserialize( unserialize( $serialization ) );
151156
}
152157

153158
/**
@@ -205,7 +210,7 @@ public function getChanges(): array {
205210
*/
206211
public function getAddedValues(): array {
207212
return array_map(
208-
function( DiffOpAdd $addition ) {
213+
static function ( DiffOpAdd $addition ) {
209214
return $addition->getNewValue();
210215
},
211216
$this->getTypeOperations( 'add' )
@@ -219,7 +224,7 @@ function( DiffOpAdd $addition ) {
219224
*/
220225
public function getRemovedValues(): array {
221226
return array_map(
222-
function( DiffOpRemove $addition ) {
227+
static function ( DiffOpRemove $addition ) {
223228
return $addition->getOldValue();
224229
},
225230
$this->getTypeOperations( 'remove' )
@@ -335,7 +340,7 @@ public function hasAssociativeOperations(): bool {
335340
*
336341
* @return array
337342
*/
338-
public function toArray( callable $valueConverter = null ): array {
343+
public function toArray( ?callable $valueConverter = null ): array {
339344
$operations = [];
340345

341346
foreach ( $this->getOperations() as $key => $diffOp ) {

src/DiffOp/DiffOp.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ public function isAtomic(): bool;
5959
*
6060
* @return array
6161
*/
62-
public function toArray( callable $valueConverter = null ): array;
62+
public function toArray( ?callable $valueConverter = null ): array;
6363

6464
}

src/DiffOp/DiffOpAdd.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
class DiffOpAdd extends AtomicDiffOp {
1717

18+
/** @var mixed */
1819
private $newValue;
1920

2021
/**
@@ -98,7 +99,7 @@ public function __unserialize( $data ): void {
9899
*
99100
* @return array
100101
*/
101-
public function toArray( callable $valueConverter = null ): array {
102+
public function toArray( ?callable $valueConverter = null ): array {
102103
return [
103104
'type' => $this->getType(),
104105
'newvalue' => $this->objectToArray( $this->newValue, $valueConverter ),

src/DiffOp/DiffOpChange.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
class DiffOpChange extends AtomicDiffOp {
1717

18+
/** @var mixed */
1819
private $newValue;
20+
/** @var mixed */
1921
private $oldValue;
2022

2123
/**
@@ -88,7 +90,7 @@ public function __serialize(): array {
8890
*/
8991
#[\ReturnTypeWillChange]
9092
public function unserialize( $serialization ) {
91-
$this->__unserialize( unserialize ($serialization) );
93+
$this->__unserialize( unserialize( $serialization ) );
9294
}
9395

9496
/**
@@ -110,7 +112,7 @@ public function __unserialize( $data ): void {
110112
*
111113
* @return array
112114
*/
113-
public function toArray( callable $valueConverter = null ): array {
115+
public function toArray( ?callable $valueConverter = null ): array {
114116
return [
115117
'type' => $this->getType(),
116118
'newvalue' => $this->objectToArray( $this->newValue, $valueConverter ),

src/DiffOp/DiffOpRemove.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
class DiffOpRemove extends AtomicDiffOp {
1717

18+
/** @var mixed */
1819
private $oldValue;
1920

2021
/**
@@ -98,7 +99,7 @@ public function __unserialize( $data ): void {
9899
*
99100
* @return array
100101
*/
101-
public function toArray( callable $valueConverter = null ): array {
102+
public function toArray( ?callable $valueConverter = null ): array {
102103
return [
103104
'type' => $this->getType(),
104105
'oldvalue' => $this->objectToArray( $this->oldValue, $valueConverter ),

src/Differ/ListDiffer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ListDiffer implements Differ {
2828
*/
2929
private $arrayComparer;
3030

31-
public function __construct( ArrayComparer $arrayComparer = null ) {
31+
public function __construct( ?ArrayComparer $arrayComparer = null ) {
3232
$this->arrayComparer = $arrayComparer ?? new StrictArrayComparer();
3333
}
3434

src/Differ/MapDiffer.php

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ class MapDiffer implements Differ {
4343
/**
4444
* The third argument ($comparer) was added in 3.0
4545
*/
46-
public function __construct( bool $recursively = false, Differ $listDiffer = null, ValueComparer $comparer = null ) {
46+
public function __construct(
47+
bool $recursively = false,
48+
?Differ $listDiffer = null,
49+
?ValueComparer $comparer = null
50+
) {
4751
$this->recursively = $recursively;
4852
$this->listDiffer = $listDiffer ?? new ListDiffer();
4953
$this->valueComparer = $comparer ?? new StrictComparer();
@@ -86,6 +90,12 @@ private function getAllKeys( array $oldSet, array $newSet ): array {
8690
) );
8791
}
8892

93+
/**
94+
* @param mixed $key
95+
* @param array $oldSet
96+
* @param mixed $newSet
97+
* @return DiffOp
98+
*/
8999
private function getDiffOpForElement( $key, array $oldSet, array $newSet ) {
90100
if ( $this->recursively ) {
91101
$diffOp = $this->getDiffOpForElementRecursively( $key, $oldSet, $newSet );
@@ -105,11 +115,9 @@ private function getDiffOpForElement( $key, array $oldSet, array $newSet ) {
105115

106116
if ( $hasOld && $hasNew ) {
107117
return new DiffOpChange( $oldSet[$key], $newSet[$key] );
108-
}
109-
elseif ( $hasOld ) {
118+
} elseif ( $hasOld ) {
110119
return new DiffOpRemove( $oldSet[$key] );
111-
}
112-
elseif ( $hasNew ) {
120+
} elseif ( $hasNew ) {
113121
return new DiffOpAdd( $newSet[$key] );
114122
}
115123

@@ -118,6 +126,12 @@ private function getDiffOpForElement( $key, array $oldSet, array $newSet ) {
118126
// @codeCoverageIgnoreEnd
119127
}
120128

129+
/**
130+
* @param mixed $key
131+
* @param array $oldSet
132+
* @param mixed $newSet
133+
* @return ?Diff
134+
*/
121135
private function getDiffOpForElementRecursively( $key, array $oldSet, array $newSet ) {
122136
$old = array_key_exists( $key, $oldSet ) ? $oldSet[$key] : [];
123137
$new = array_key_exists( $key, $newSet ) ? $newSet[$key] : [];

0 commit comments

Comments
 (0)