Skip to content

Commit a864c76

Browse files
authored
Add support for PHP 8.1 native enums (#56)
* Add support for PHP 8.1 native enums * Add integration test for PHP 8.1 native enums * Updated testing matrix * Clean integration tests * Fixed coverage * Changed PHP default version for tests * Fixed coverage --------- Co-authored-by: Yann Eugoné <[email protected]>
1 parent e051412 commit a864c76

21 files changed

+484
-96
lines changed

.github/workflows/tests.yml

+26-28
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,30 @@ jobs:
1414
strategy:
1515
matrix:
1616
include:
17-
- php-version: 7.1
18-
symfony-version: 4.4.*
19-
- php-version: 8.1
20-
symfony-version: 4.4.*
21-
- php-version: 7.2
22-
symfony-version: 5.2.*
23-
- php-version: 7.2
24-
symfony-version: 5.3.*
25-
- php-version: 7.2
26-
symfony-version: 5.4.*
27-
- php-version: 8.1
28-
symfony-version: 5.4.*
29-
- php-version: 8.0
30-
symfony-version: 6.0.*
31-
- php-version: 8.1
32-
symfony-version: 6.0.*
17+
- php-version: '7.1'
18+
symfony-version: '4.4.*'
19+
20+
- php-version: '7.4'
21+
symfony-version: '4.4.*'
22+
- php-version: '7.4'
23+
symfony-version: '5.4.*'
24+
25+
- php-version: '8.0'
26+
symfony-version: '4.4.*'
27+
- php-version: '8.0'
28+
symfony-version: '5.4.*'
29+
- php-version: '8.0'
30+
symfony-version: '6.0.*'
31+
32+
- php-version: '8.1'
33+
symfony-version: '5.4.*'
34+
- php-version: '8.1'
35+
symfony-version: '6.3.*'
36+
37+
- php-version: '8.2'
38+
symfony-version: '5.4.*'
39+
- php-version: '8.2'
40+
symfony-version: '6.3.*'
3341

3442
steps:
3543
- name: "Checkout"
@@ -59,11 +67,6 @@ jobs:
5967
name: "Code coverage"
6068
runs-on: ubuntu-latest
6169

62-
strategy:
63-
matrix:
64-
include:
65-
- php-version: 8.1
66-
6770
steps:
6871
- name: "Checkout"
6972
uses: actions/checkout@v2
@@ -72,7 +75,7 @@ jobs:
7275
uses: shivammathur/setup-php@v2
7376
with:
7477
coverage: xdebug
75-
php-version: ${{ matrix.php-version }}
78+
php-version: '8.2'
7679

7780
- name: "Install dependencies with composer"
7881
run: composer update --no-interaction --no-progress
@@ -90,11 +93,6 @@ jobs:
9093
name: "Checkstyle"
9194
runs-on: ubuntu-latest
9295

93-
strategy:
94-
matrix:
95-
include:
96-
- php-version: 8.1
97-
9896
steps:
9997
- name: "Checkout"
10098
uses: actions/checkout@v2
@@ -103,7 +101,7 @@ jobs:
103101
uses: shivammathur/setup-php@v2
104102
with:
105103
coverage: xdebug
106-
php-version: ${{ matrix.php-version }}
104+
php-version: '8.2'
107105

108106
- name: "Install dependencies with composer"
109107
run: composer update --no-interaction --no-progress

src/Exception/LogicException.php

+8
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,12 @@ public static function invalidMyClabsEnumClass(string $enum): self
3838
$enum
3939
));
4040
}
41+
42+
public static function invalidUnitEnum(string $enum): self
43+
{
44+
return new self(sprintf(
45+
'Enum class must be valid PHP enum. Got "%s".',
46+
$enum
47+
));
48+
}
4149
}

src/NativeEnum.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle;
6+
7+
use UnitEnum;
8+
use Yokai\EnumBundle\Exception\LogicException;
9+
10+
/**
11+
* @author Yann Eugoné <[email protected]>
12+
*/
13+
class NativeEnum extends Enum
14+
{
15+
/**
16+
* @param string $enum
17+
* @param string|null $name
18+
*/
19+
public function __construct(string $enum, string $name = null)
20+
{
21+
if (!\is_a($enum, UnitEnum::class, true)) {
22+
throw LogicException::invalidUnitEnum($enum);
23+
}
24+
25+
if ($name === null && static::class === __CLASS__) {
26+
$name = $enum;
27+
}
28+
29+
$choices = [];
30+
foreach ($enum::cases() as $case) {
31+
$choices[$case->name] = $case;
32+
}
33+
34+
parent::__construct($choices, $name);
35+
}
36+
}

src/NativeTranslatedEnum.php

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle;
6+
7+
use UnitEnum;
8+
use Symfony\Contracts\Translation\TranslatorInterface;
9+
use Yokai\EnumBundle\Exception\LogicException;
10+
11+
/**
12+
* @author Yann Eugoné <[email protected]>
13+
*/
14+
class NativeTranslatedEnum extends TranslatedEnum
15+
{
16+
/**
17+
* @param string $enum
18+
* @param TranslatorInterface $translator
19+
* @param string $transPattern
20+
* @param string $transDomain
21+
* @param string|null $name
22+
*/
23+
public function __construct(
24+
string $enum,
25+
TranslatorInterface $translator,
26+
string $transPattern,
27+
string $transDomain = 'messages',
28+
string $name = null
29+
) {
30+
if (!\is_a($enum, UnitEnum::class, true)) {
31+
throw LogicException::invalidUnitEnum($enum);
32+
}
33+
34+
if ($name === null && static::class === __CLASS__) {
35+
$name = $enum;
36+
}
37+
38+
$values = [];
39+
foreach ($enum::cases() as $case) {
40+
$values[$case->name] = $case;
41+
}
42+
43+
parent::__construct($values, $translator, $transPattern, $transDomain, $name);
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
6+
Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestLabelEnum: ~
7+
Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestMyCLabsStatusEnum: ~
8+
Yokai\EnumBundle\Tests\Integration\App\Form\PullRequestType: ~
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
6+
Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestLabelEnum: ~
7+
Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestNativeStatusEnum: ~
8+
Yokai\EnumBundle\Tests\Integration\App\Form\PullRequestType: ~

tests/Integration/config/services.yaml

-9
This file was deleted.

tests/Integration/src/Enum/PullRequestStatusEnum.php renamed to tests/Integration/src/Enum/PullRequestMyCLabsStatusEnum.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
use Symfony\Contracts\Translation\TranslatorInterface;
88
use Yokai\EnumBundle\MyCLabsTranslatedEnum;
9-
use Yokai\EnumBundle\Tests\Integration\App\Model\Status;
9+
use Yokai\EnumBundle\Tests\Integration\App\Model\MyCLabsStatus;
1010

1111
/**
1212
* @author Yann Eugoné <[email protected]>
1313
*/
14-
final class PullRequestStatusEnum extends MyCLabsTranslatedEnum
14+
final class PullRequestMyCLabsStatusEnum extends MyCLabsTranslatedEnum
1515
{
1616
public function __construct(TranslatorInterface $translator)
1717
{
18-
parent::__construct(Status::class, $translator, 'pull_request.status.%s');
18+
parent::__construct(MyCLabsStatus::class, $translator, 'pull_request.status.%s');
1919
}
2020
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Integration\App\Enum;
6+
7+
use Symfony\Contracts\Translation\TranslatorInterface;
8+
use Yokai\EnumBundle\NativeTranslatedEnum;
9+
use Yokai\EnumBundle\Tests\Integration\App\Model\NativeStatus;
10+
11+
/**
12+
* @author Yann Eugoné <[email protected]>
13+
*/
14+
final class PullRequestNativeStatusEnum extends NativeTranslatedEnum
15+
{
16+
public function __construct(TranslatorInterface $translator)
17+
{
18+
parent::__construct(NativeStatus::class, $translator, 'pull_request.status.%s');
19+
}
20+
}

tests/Integration/src/Kernel.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ public function registerContainerConfiguration(LoaderInterface $loader): void
3636
$loader->load(__DIR__ . '/../config/packages/annotations.yaml');
3737
}
3838

39-
$loader->load(__DIR__ . '/../config/services.yaml');
39+
if (\PHP_VERSION_ID < 80100) {
40+
$loader->load(__DIR__ . '/../config/services-8.0.yaml');
41+
} else {
42+
$loader->load(__DIR__ . '/../config/services-8.1.yaml');
43+
}
4044
}
4145

4246
/**

tests/Integration/src/Model/Status.php renamed to tests/Integration/src/Model/MyCLabsStatus.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* @author Yann Eugoné <[email protected]>
1515
*/
16-
final class Status extends Enum
16+
final class MyCLabsStatus extends Enum
1717
{
1818
private const OPENED = 'opened';
1919
private const MERGED = 'merged';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Integration\App\Model;
6+
7+
/**
8+
* @author Yann Eugoné <[email protected]>
9+
*/
10+
enum NativeStatus: string
11+
{
12+
case OPENED = 'opened';
13+
case MERGED = 'merged';
14+
case CLOSED = 'closed';
15+
}

tests/Integration/src/Model/PullRequestUsingAnnotations.php renamed to tests/Integration/src/Model/PullRequestPhp7.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
namespace Yokai\EnumBundle\Tests\Integration\App\Model;
66

77
use Yokai\EnumBundle\Validator\Constraints\Enum;
8-
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestStatusEnum;
8+
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestMyCLabsStatusEnum;
99
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestLabelEnum;
1010

1111
/**
1212
* @author Yann Eugoné <[email protected]>
1313
*/
14-
final class PullRequestUsingAnnotations
14+
final class PullRequestPhp7
1515
{
1616
/**
17-
* @var Status
17+
* @var MyCLabsStatus
1818
*
19-
* @Enum(PullRequestStatusEnum::class)
19+
* @Enum(PullRequestMyCLabsStatusEnum::class)
2020
*/
2121
public $status;
2222

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Integration\App\Model;
6+
7+
use Yokai\EnumBundle\Validator\Constraints\Enum;
8+
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestMyCLabsStatusEnum;
9+
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestLabelEnum;
10+
11+
/**
12+
* @author Yann Eugoné <[email protected]>
13+
*/
14+
final class PullRequestPhp80
15+
{
16+
/**
17+
* @var MyCLabsStatus
18+
*/
19+
#[Enum(enum: PullRequestMyCLabsStatusEnum::class)]
20+
public $status;
21+
22+
/**
23+
* @var string[]
24+
*/
25+
#[Enum(enum: PullRequestLabelEnum::class, multiple: true)]
26+
public $labels;
27+
}

tests/Integration/src/Model/PullRequestUsingAttributes.php renamed to tests/Integration/src/Model/PullRequestPhp81.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
namespace Yokai\EnumBundle\Tests\Integration\App\Model;
66

77
use Yokai\EnumBundle\Validator\Constraints\Enum;
8-
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestStatusEnum;
8+
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestNativeStatusEnum;
99
use Yokai\EnumBundle\Tests\Integration\App\Enum\PullRequestLabelEnum;
1010

1111
/**
1212
* @author Yann Eugoné <[email protected]>
1313
*/
14-
final class PullRequestUsingAttributes
14+
final class PullRequestPhp81
1515
{
1616
/**
17-
* @var Status
17+
* @var NativeStatus
1818
*/
19-
#[Enum(enum: PullRequestStatusEnum::class)]
19+
#[Enum(enum: PullRequestNativeStatusEnum::class)]
2020
public $status;
2121

2222
/**

0 commit comments

Comments
 (0)