diff --git a/composer.json b/composer.json index 89efa812f..7e08a8b48 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "optimize-autoloader": true, "classmap-authoritative": true, "platform": { - "php": "8.2" + "php": "8.3" }, "sort-packages": true, "allow-plugins": { diff --git a/composer.lock b/composer.lock index 68b431877..d05ee58cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "200a8154ad3e70e34f2bc8f98a731841", + "content-hash": "d8942b7fe7e33b894b29173304db66c0", "packages": [ { "name": "christian-riesen/base32", @@ -469,7 +469,7 @@ "platform": {}, "platform-dev": {}, "platform-overrides": { - "php": "8.2" + "php": "8.3" }, "plugin-api-version": "2.9.0" } diff --git a/rector.php b/rector.php index 44a410f9e..de4f845db 100644 --- a/rector.php +++ b/rector.php @@ -25,7 +25,7 @@ ) ->withSets([ NextcloudSets::NEXTCLOUD_35, - PHPUnitSetList::PHPUNIT_110, + PHPUnitSetList::PHPUNIT_120, ]) ->withPhpSets( php82: true, diff --git a/tests/Unit/Activity/ProviderTest.php b/tests/Unit/Activity/ProviderTest.php index a7353be9c..154474424 100644 --- a/tests/Unit/Activity/ProviderTest.php +++ b/tests/Unit/Activity/ProviderTest.php @@ -27,9 +27,9 @@ class ProviderTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->createMock(IFactory::class); - $this->urlGenerator = $this->createMock(IURLGenerator::class); - $logger = $this->createMock(ILogger::class); + $this->l10n = $this->createStub(IFactory::class); + $this->urlGenerator = $this->createStub(IURLGenerator::class); + $logger = $this->createStub(ILogger::class); $this->provider = new Provider($this->l10n, $this->urlGenerator, $logger); } @@ -60,17 +60,11 @@ public function testParse($subject): void { $event->expects($this->once()) ->method('getApp') ->willReturn('twofactor_totp'); - $this->l10n->expects($this->once()) - ->method('get') - ->with('twofactor_totp', $lang) + $this->l10n->method('get') ->willReturn($l); - $this->urlGenerator->expects($this->once()) - ->method('imagePath') - ->with('core', 'actions/password.svg') + $this->urlGenerator->method('imagePath') ->willReturn('path/to/image'); - $this->urlGenerator->expects($this->once()) - ->method('getAbsoluteURL') - ->with('path/to/image') + $this->urlGenerator->method('getAbsoluteURL') ->willReturn('absolute/path/to/image'); $event->expects($this->once()) ->method('setIcon') diff --git a/tests/Unit/Controller/SettingsControllerTest.php b/tests/Unit/Controller/SettingsControllerTest.php index f597ea0c9..5ffe91c37 100644 --- a/tests/Unit/Controller/SettingsControllerTest.php +++ b/tests/Unit/Controller/SettingsControllerTest.php @@ -30,22 +30,19 @@ final class SettingsControllerTest extends TestCase { private $controller; protected function setUp(): void { - $this->userSession = $this->createMock(IUserSession::class); - $this->totp = $this->createMock(ITotp::class); + $this->userSession = $this->createStub(IUserSession::class); + $this->totp = $this->createStub(ITotp::class); $this->defaults = new Defaults(); - $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->urlGenerator = $this->createStub(IURLGenerator::class); $this->controller = new SettingsController('twofactor_totp', $this->createStub(IRequest::class), $this->userSession, $this->totp, $this->defaults, $this->urlGenerator); } public function testDisabledState(): void { $user = $this->createStub(IUser::class); - $this->userSession->expects($this->once()) - ->method('getUser') + $this->userSession->method('getUser') ->willReturn($user); - $this->totp->expects($this->once()) - ->method('hasSecret') - ->with($user) + $this->totp->method('hasSecret') ->willReturn(false); $expected = new JSONResponse([ @@ -56,30 +53,20 @@ public function testDisabledState(): void { } public function testCreateSecret(): void { - $user = $this->createMock(IUser::class); - $this->userSession->expects($this->exactly(2)) - ->method('getUser') + $user = $this->createStub(IUser::class); + $this->userSession->method('getUser') ->willReturn($user); - $user->expects($this->once()) - ->method('getCloudId') + $user->method('getCloudId') ->willReturn('user@instance.com'); - $this->totp->expects($this->once()) - ->method('createSecret') - ->with($user) + $this->totp->method('createSecret') ->willReturn('newsecret'); $dbSecret = new TotpSecret(); $dbSecret->setAlgorithm(ITotp::ALGORITHM_SHA1); - $this->totp->expects($this->once()) - ->method('getSecret') - ->with($user) + $this->totp->method('getSecret') ->willReturn($dbSecret); - $this->urlGenerator->expects($this->once()) - ->method('linkToRoute') - ->with('theming.Icon.getFavicon', ['app' => 'core']) + $this->urlGenerator->method('linkToRoute') ->willReturn('/path/to/favicon'); - $this->urlGenerator->expects($this->once()) - ->method('getAbsoluteURL') - ->with('/path/to/favicon') + $this->urlGenerator->method('getAbsoluteURL') ->willReturn('https://cloud.example.com/path/to/favicon'); $issuer = rawurlencode((string)$this->defaults->getName()); @@ -94,30 +81,20 @@ public function testCreateSecret(): void { } public function testCreateSecretWithNonDefaultAlgorithm(): void { - $user = $this->createMock(IUser::class); - $this->userSession->expects($this->exactly(2)) - ->method('getUser') + $user = $this->createStub(IUser::class); + $this->userSession->method('getUser') ->willReturn($user); - $user->expects($this->once()) - ->method('getCloudId') + $user->method('getCloudId') ->willReturn('user@instance.com'); - $this->totp->expects($this->once()) - ->method('createSecret') - ->with($user) + $this->totp->method('createSecret') ->willReturn('newsecret'); $dbSecret = new TotpSecret(); $dbSecret->setAlgorithm(ITotp::ALGORITHM_SHA256); - $this->totp->expects($this->once()) - ->method('getSecret') - ->with($user) + $this->totp->method('getSecret') ->willReturn($dbSecret); - $this->urlGenerator->expects($this->once()) - ->method('linkToRoute') - ->with('theming.Icon.getFavicon', ['app' => 'core']) + $this->urlGenerator->method('linkToRoute') ->willReturn('/path/to/favicon'); - $this->urlGenerator->expects($this->once()) - ->method('getAbsoluteURL') - ->with('/path/to/favicon') + $this->urlGenerator->method('getAbsoluteURL') ->willReturn('https://cloud.example.com/path/to/favicon'); $issuer = rawurlencode((string)$this->defaults->getName()); @@ -133,40 +110,42 @@ public function testCreateSecretWithNonDefaultAlgorithm(): void { public function testEnableSecret(): void { $user = $this->createStub(IUser::class); - $this->userSession->expects($this->once()) - ->method('getUser') + $this->userSession->method('getUser') ->willReturn($user); - $this->totp->expects($this->once()) + $totp = $this->createMock(ITotp::class); + $totp->expects($this->once()) ->method('enable') ->with($user, '123456') ->willReturn(true); + $controller = new SettingsController('twofactor_totp', $this->createStub(IRequest::class), $this->userSession, $totp, $this->defaults, $this->urlGenerator); $expected = new JSONResponse([ 'state' => ITotp::STATE_ENABLED, ]); - $this->assertEquals($expected, $this->controller->enable(ITotp::STATE_ENABLED, '123456')); + $this->assertEquals($expected, $controller->enable(ITotp::STATE_ENABLED, '123456')); } public function testDisableSecret(): void { $user = $this->createStub(IUser::class); - $this->userSession->expects($this->once()) - ->method('getUser') + $this->userSession->method('getUser') ->willReturn($user); - $this->totp->expects($this->once()) - ->method('deleteSecret'); + $totp = $this->createMock(ITotp::class); + $totp->expects($this->once()) + ->method('deleteSecret') + ->with($user); + $controller = new SettingsController('twofactor_totp', $this->createStub(IRequest::class), $this->userSession, $totp, $this->defaults, $this->urlGenerator); $expected = new JSONResponse([ 'state' => ITotp::STATE_DISABLED, ]); - $this->assertEquals($expected, $this->controller->enable(ITotp::STATE_DISABLED)); + $this->assertEquals($expected, $controller->enable(ITotp::STATE_DISABLED)); } public function testEnableInvalidState(): void { $user = $this->createStub(IUser::class); - $this->userSession->expects($this->once()) - ->method('getUser') + $this->userSession->method('getUser') ->willReturn($user); $this->expectException(InvalidArgumentException::class); diff --git a/tests/Unit/Listener/StateChangeActivityTest.php b/tests/Unit/Listener/StateChangeActivityTest.php index 0a9f631fb..b2801d3a2 100644 --- a/tests/Unit/Listener/StateChangeActivityTest.php +++ b/tests/Unit/Listener/StateChangeActivityTest.php @@ -35,7 +35,7 @@ protected function setUp(): void { public function testHandleStateEvent(): void { $uid = 'user234'; - $user = $this->createMock(IUser::class); + $user = $this->createStub(IUser::class); $user->method('getUID')->willReturn($uid); $event = new StateChanged($user, true); $activityEvent = $this->createMock(IEvent::class); @@ -67,7 +67,7 @@ public function testHandleStateEvent(): void { public function testHandleDisabledByAdminEvent(): void { $uid = 'user234'; - $user = $this->createMock(IUser::class); + $user = $this->createStub(IUser::class); $user->method('getUID')->willReturn($uid); $event = new DisabledByAdmin($user); $activityEvent = $this->createMock(IEvent::class); diff --git a/tests/Unit/Listener/StateChangeRegistryUpdaterTest.php b/tests/Unit/Listener/StateChangeRegistryUpdaterTest.php index 1528bc1b9..a18f2f351 100644 --- a/tests/Unit/Listener/StateChangeRegistryUpdaterTest.php +++ b/tests/Unit/Listener/StateChangeRegistryUpdaterTest.php @@ -30,7 +30,7 @@ protected function setUp(): void { parent::setUp(); $this->registry = $this->createMock(IRegistry::class); - $this->provider = $this->createMock(TotpProvider::class); + $this->provider = $this->createStub(TotpProvider::class); $this->listener = new StateChangeRegistryUpdater($this->registry, $this->provider); } diff --git a/tests/Unit/Provider/AtLoginProviderTest.php b/tests/Unit/Provider/AtLoginProviderTest.php index 05e662660..d74c063f4 100644 --- a/tests/Unit/Provider/AtLoginProviderTest.php +++ b/tests/Unit/Provider/AtLoginProviderTest.php @@ -19,7 +19,7 @@ class AtLoginProviderTest extends TestCase { protected function setUp(): void { parent::setUp(); - $urlGenerator = $this->createMock(IURLGenerator::class); + $urlGenerator = $this->createStub(IURLGenerator::class); $this->provider = new AtLoginProvider( $urlGenerator diff --git a/tests/Unit/Provider/TotpProviderTest.php b/tests/Unit/Provider/TotpProviderTest.php index 01325c7e0..472145965 100644 --- a/tests/Unit/Provider/TotpProviderTest.php +++ b/tests/Unit/Provider/TotpProviderTest.php @@ -46,11 +46,11 @@ class TotpProviderTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->totp = $this->createMock(ITotp::class); - $this->l10n = $this->createMock(IL10N::class); - $this->container = $this->createMock(ContainerInterface::class); - $this->initialState = $this->createMock(IInitialState::class); - $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->totp = $this->createStub(ITotp::class); + $this->l10n = $this->createStub(IL10N::class); + $this->container = $this->createStub(ContainerInterface::class); + $this->initialState = $this->createStub(IInitialState::class); + $this->urlGenerator = $this->createStub(IURLGenerator::class); $this->provider = new TotpProvider( $this->totp, @@ -79,8 +79,7 @@ public function testGetDisplayName(): void { public function testGetDescription(): void { $description = 'Authenticate with a TOTP app'; - $this->l10n->expects($this->once()) - ->method('t') + $this->l10n->method('t') ->willReturnArgument(0); $descr = $this->provider->getDescription(); @@ -89,9 +88,7 @@ public function testGetDescription(): void { } public function testGetLightIcon(): void { - $this->urlGenerator->expects($this->once()) - ->method('imagePath') - ->with('twofactor_totp', 'app.svg') + $this->urlGenerator->method('imagePath') ->willReturn('/path/to/app.svg'); $icon = $this->provider->getLightIcon(); @@ -100,9 +97,7 @@ public function testGetLightIcon(): void { } public function testGetDarkIcon(): void { - $this->urlGenerator->expects($this->once()) - ->method('imagePath') - ->with('twofactor_totp', 'app-dark.svg') + $this->urlGenerator->method('imagePath') ->willReturn('/path/to/app-dark.svg'); $icon = $this->provider->getDarkIcon(); @@ -114,27 +109,31 @@ public function testGetPersonalSettings(): void { $expected = new Personal(); $user = $this->createStub(IUser::class); - $this->totp->expects($this->once()) - ->method('hasSecret') - ->with($user) + $this->totp->method('hasSecret') ->willReturn(true); - $this->initialState->expects($this->once()) + $initialState = $this->createMock(IInitialState::class); + $initialState->expects($this->once()) ->method('provideInitialState') ->with( 'state', true ); + $provider = new TotpProvider( + $this->totp, + $this->l10n, + $this->container, + $initialState, + $this->urlGenerator + ); - $actual = $this->provider->getPersonalSettings($user); + $actual = $provider->getPersonalSettings($user); $this->assertEquals($expected, $actual); } public function testVerifyChallengeSecretNotFound(): void { $user = $this->createStub(IUser::class); - $this->totp->expects($this->once()) - ->method('getSecret') - ->with($user) + $this->totp->method('getSecret') ->willThrowException(new NoTotpSecretFoundException()); $result = $this->provider->verifyChallenge($user, '123456'); @@ -145,36 +144,48 @@ public function testVerifyChallengeSecretNotFound(): void { public function testVerifyChallengeStripNonDigits(): void { $user = $this->createStub(IUser::class); $secret = new TotpSecret(); - $this->totp->expects(self::once()) - ->method('getSecret') - ->with($user) + $totp = $this->createMock(ITotp::class); + $totp->method('getSecret') ->willReturn($secret); - $this->totp->expects(self::once()) + $totp->expects($this->once()) ->method('validateSecret') ->with($secret, '123456') ->willReturn(true); + $provider = new TotpProvider( + $totp, + $this->l10n, + $this->container, + $this->initialState, + $this->urlGenerator + ); - $result = $this->provider->verifyChallenge($user, ' 123456 a '); + $result = $provider->verifyChallenge($user, ' 123456 a '); $this->assertTrue($result); } public function testDeactivate(): void { $user = $this->createStub(IUser::class); - $this->totp->expects($this->once()) + $totp = $this->createMock(ITotp::class); + $totp->expects($this->once()) ->method('deleteSecret') ->with($user); + $provider = new TotpProvider( + $totp, + $this->l10n, + $this->container, + $this->initialState, + $this->urlGenerator + ); - $this->provider->disableFor($user); + $provider->disableFor($user); } public function testGetSetupProvider(): void { /** @var IUser|MockObject $user */ $user = $this->createStub(IUser::class); $provider = $this->createStub(AtLoginProvider::class); - $this->container->expects($this->once()) - ->method('get') - ->with(AtLoginProvider::class) + $this->container->method('get') ->willReturn($provider); $result = $this->provider->getLoginSetup($user); diff --git a/tests/Unit/Service/TotpTest.php b/tests/Unit/Service/TotpTest.php index a42f8ed92..7071e26d1 100644 --- a/tests/Unit/Service/TotpTest.php +++ b/tests/Unit/Service/TotpTest.php @@ -20,159 +20,127 @@ use OCP\IUser; use OCP\Security\ICrypto; use OCP\Security\ISecureRandom; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; final class TotpTest extends TestCase { - private TotpSecretMapper $secretMapper; private ICrypto $crypto; - private ISecureRandom $random; private IAppConfig $appConfig; - private Totp $totp; protected function setUp(): void { - $this->secretMapper = $this->createMock(TotpSecretMapper::class); - $this->crypto = $this->createMock(ICrypto::class); - $this->random = $this->createMock(ISecureRandom::class); - $this->appConfig = $this->createMock(IAppConfig::class); + $this->crypto = $this->createStub(ICrypto::class); + $this->crypto->method('encrypt')->willReturnArgument(0); + $this->appConfig = $this->createStub(IAppConfig::class); + } - $this->totp = new Totp( - $this->secretMapper, + private function buildTotp(TotpSecretMapper $secretMapper, ISecureRandom $random): Totp { + return new Totp( + $secretMapper, $this->crypto, $this->createStub(IEventDispatcher::class), - $this->random, + $random, $this->appConfig, ); } - private function stubNoExistingSecret(): void { - $this->secretMapper->method('getSecret') + private function stubMapperWithoutSecret(): TotpSecretMapper { + $secretMapper = $this->createStub(TotpSecretMapper::class); + $secretMapper->method('getSecret') ->willThrowException(new DoesNotExistException('')); + $secretMapper->method('insert')->willReturnArgument(0); + return $secretMapper; } - public function testCreateSecretStoresDefaultAlgorithm(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->with('algorithm', ITotp::DEFAULT_ALGORITHM) - ->willReturn(ITotp::DEFAULT_ALGORITHM); - $this->appConfig->method('getAppValueInt') - ->willReturn(ITotp::DEFAULT_SECRET_LENGTH); - $this->random->method('generate')->willReturn(str_repeat('A', 32)); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->secretMapper->expects($this->once()) + private function mockMapperExpectingAlgorithm(string $expectedAlgorithm): TotpSecretMapper&MockObject { + $secretMapper = $this->createMock(TotpSecretMapper::class); + $secretMapper->method('getSecret') + ->willThrowException(new DoesNotExistException('')); + $secretMapper->expects($this->once()) ->method('insert') - ->with($this->callback(function (TotpSecret $entity): bool { - $this->assertSame(ITotp::ALGORITHM_SHA1, $entity->getAlgorithm()); + ->with($this->callback(function (TotpSecret $entity) use ($expectedAlgorithm): bool { + $this->assertSame($expectedAlgorithm, $entity->getAlgorithm()); return true; })) ->willReturnArgument(0); + return $secretMapper; + } + + public function testCreateSecretStoresDefaultAlgorithm(): void { + $this->appConfig->method('getAppValueString')->willReturn(ITotp::DEFAULT_ALGORITHM); + $this->appConfig->method('getAppValueInt')->willReturn(ITotp::DEFAULT_SECRET_LENGTH); + $random = $this->createStub(ISecureRandom::class); + $random->method('generate')->willReturn(str_repeat('A', 32)); + $secretMapper = $this->mockMapperExpectingAlgorithm(ITotp::ALGORITHM_SHA1); + $totp = $this->buildTotp($secretMapper, $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } public function testCreateSecretStoresConfiguredAlgorithm(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->with('algorithm', ITotp::DEFAULT_ALGORITHM) - ->willReturn(ITotp::ALGORITHM_SHA256); - $this->appConfig->method('getAppValueInt') - ->willReturn(ITotp::DEFAULT_SECRET_LENGTH); - $this->random->method('generate')->willReturn(str_repeat('A', 32)); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->secretMapper->expects($this->once()) - ->method('insert') - ->with($this->callback(function (TotpSecret $entity): bool { - $this->assertSame(ITotp::ALGORITHM_SHA256, $entity->getAlgorithm()); - return true; - })) - ->willReturnArgument(0); + $this->appConfig->method('getAppValueString')->willReturn(ITotp::ALGORITHM_SHA256); + $this->appConfig->method('getAppValueInt')->willReturn(ITotp::DEFAULT_SECRET_LENGTH); + $random = $this->createStub(ISecureRandom::class); + $random->method('generate')->willReturn(str_repeat('A', 32)); + $secretMapper = $this->mockMapperExpectingAlgorithm(ITotp::ALGORITHM_SHA256); + $totp = $this->buildTotp($secretMapper, $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } public function testCreateSecretFallsBackToDefaultForInvalidAlgorithm(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->with('algorithm', ITotp::DEFAULT_ALGORITHM) - ->willReturn('md5'); - $this->appConfig->method('getAppValueInt') - ->willReturn(ITotp::DEFAULT_SECRET_LENGTH); - $this->random->method('generate')->willReturn(str_repeat('A', 32)); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->secretMapper->expects($this->once()) - ->method('insert') - ->with($this->callback(function (TotpSecret $entity): bool { - $this->assertSame(ITotp::DEFAULT_ALGORITHM, $entity->getAlgorithm()); - return true; - })) - ->willReturnArgument(0); + $this->appConfig->method('getAppValueString')->willReturn('md5'); + $this->appConfig->method('getAppValueInt')->willReturn(ITotp::DEFAULT_SECRET_LENGTH); + $random = $this->createStub(ISecureRandom::class); + $random->method('generate')->willReturn(str_repeat('A', 32)); + $secretMapper = $this->mockMapperExpectingAlgorithm(ITotp::DEFAULT_ALGORITHM); + $totp = $this->buildTotp($secretMapper, $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } public function testCreateSecretUsesConfiguredLength(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->willReturn(ITotp::DEFAULT_ALGORITHM); - $this->appConfig->method('getAppValueInt') - ->with('secret_length', ITotp::DEFAULT_SECRET_LENGTH) - ->willReturn(64); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->random->expects($this->once()) + $this->appConfig->method('getAppValueString')->willReturn(ITotp::DEFAULT_ALGORITHM); + $this->appConfig->method('getAppValueInt')->willReturn(64); + $random = $this->createMock(ISecureRandom::class); + $random->expects($this->once()) ->method('generate') ->with(64, ISecureRandom::CHAR_UPPER . '234567') ->willReturn(str_repeat('A', 64)); - - $this->secretMapper->method('insert')->willReturnArgument(0); + $totp = $this->buildTotp($this->stubMapperWithoutSecret(), $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } public function testCreateSecretFallsBackToDefaultLengthWhenTooShort(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->willReturn(ITotp::DEFAULT_ALGORITHM); - $this->appConfig->method('getAppValueInt') - ->with('secret_length', ITotp::DEFAULT_SECRET_LENGTH) - ->willReturn(5); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->random->expects($this->once()) + $this->appConfig->method('getAppValueString')->willReturn(ITotp::DEFAULT_ALGORITHM); + $this->appConfig->method('getAppValueInt')->willReturn(5); + $random = $this->createMock(ISecureRandom::class); + $random->expects($this->once()) ->method('generate') ->with(ITotp::DEFAULT_SECRET_LENGTH, ISecureRandom::CHAR_UPPER . '234567') ->willReturn(str_repeat('A', ITotp::DEFAULT_SECRET_LENGTH)); - - $this->secretMapper->method('insert')->willReturnArgument(0); + $totp = $this->buildTotp($this->stubMapperWithoutSecret(), $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } public function testCreateSecretFallsBackToDefaultLengthWhenTooLong(): void { - $this->stubNoExistingSecret(); - $this->appConfig->method('getAppValueString') - ->willReturn(ITotp::DEFAULT_ALGORITHM); - $this->appConfig->method('getAppValueInt') - ->with('secret_length', ITotp::DEFAULT_SECRET_LENGTH) - ->willReturn(200); - $this->crypto->method('encrypt')->willReturnArgument(0); - - $this->random->expects($this->once()) + $this->appConfig->method('getAppValueString')->willReturn(ITotp::DEFAULT_ALGORITHM); + $this->appConfig->method('getAppValueInt')->willReturn(200); + $random = $this->createMock(ISecureRandom::class); + $random->expects($this->once()) ->method('generate') ->with(ITotp::DEFAULT_SECRET_LENGTH, ISecureRandom::CHAR_UPPER . '234567') ->willReturn(str_repeat('A', ITotp::DEFAULT_SECRET_LENGTH)); - - $this->secretMapper->method('insert')->willReturnArgument(0); + $totp = $this->buildTotp($this->stubMapperWithoutSecret(), $random); $user = $this->createStub(IUser::class); - $this->totp->createSecret($user); + $totp->createSecret($user); } } diff --git a/vendor-bin/phpunit/composer.json b/vendor-bin/phpunit/composer.json index 76ede5ece..731b89af4 100644 --- a/vendor-bin/phpunit/composer.json +++ b/vendor-bin/phpunit/composer.json @@ -1,11 +1,11 @@ { "config": { "platform": { - "php": "8.2" + "php": "8.3" } }, "require-dev": { - "christophwurst/nextcloud_testing": "^2", - "phpunit/phpunit": "^11" + "christophwurst/nextcloud_testing": "^3.0", + "phpunit/phpunit": "^12" } } diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock index 8774f23cc..d22f933d0 100644 --- a/vendor-bin/phpunit/composer.lock +++ b/vendor-bin/phpunit/composer.lock @@ -4,27 +4,27 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a2df003c92f16969537c65824e47b0da", + "content-hash": "8839ed4126293edeae394d90c7cff08a", "packages": [], "packages-dev": [ { "name": "christophwurst/nextcloud_testing", - "version": "v2.0.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/ChristophWurst/nextcloud_testing.git", - "reference": "7087e2bb880c0ff34ba3b894b734627916daa4b3" + "reference": "e944a27c4d4129df7d3aaf79f855d13ed001266b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ChristophWurst/nextcloud_testing/zipball/7087e2bb880c0ff34ba3b894b734627916daa4b3", - "reference": "7087e2bb880c0ff34ba3b894b734627916daa4b3", + "url": "https://api.github.com/repos/ChristophWurst/nextcloud_testing/zipball/e944a27c4d4129df7d3aaf79f855d13ed001266b", + "reference": "e944a27c4d4129df7d3aaf79f855d13ed001266b", "shasum": "" }, "require": { "php": "^8.0", "php-webdriver/webdriver": "^1.9", - "phpunit/phpunit": "^9.0|^10.0|^11.0" + "phpunit/phpunit": "^10.0|^11.0|^12.0" }, "type": "library", "autoload": { @@ -45,9 +45,9 @@ "description": "Simple and fast unit and integration testing framework for Nextcloud, based on PHPUnit", "support": { "issues": "https://github.com/ChristophWurst/nextcloud_testing/issues", - "source": "https://github.com/ChristophWurst/nextcloud_testing/tree/v2.0.0" + "source": "https://github.com/ChristophWurst/nextcloud_testing/tree/v3.0.0" }, - "time": "2026-03-19T12:31:27+00:00" + "time": "2026-07-23T11:18:38+00:00" }, { "name": "myclabs/deep-copy", @@ -111,20 +111,19 @@ }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -163,9 +162,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-07-04T14:30:18+00:00" }, { "name": "phar-io/manifest", @@ -353,16 +352,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.12", + "version": "12.5.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" + "reference": "186dab580576598076de6818596d12b61801880e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", - "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", "shasum": "" }, "require": { @@ -370,18 +369,16 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.1", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.3.1" + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^11.5.46" + "phpunit/phpunit": "^12.5.28" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -390,7 +387,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -419,7 +416,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" }, "funding": [ { @@ -439,32 +436,32 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:01:01+00:00" + "time": "2026-06-01T13:24:19+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.1", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", - "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -492,7 +489,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { @@ -512,28 +509,28 @@ "type": "tidelift" } ], - "time": "2026-02-02T13:52:54+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -541,7 +538,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -568,7 +565,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -576,32 +573,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -628,7 +625,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -636,32 +633,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -688,7 +685,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -696,61 +693,57 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.55", + "version": "12.5.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", - "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0608d157a284f15cc73b99a3327eff06b66a176d", + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.12", - "phpunit/php-file-iterator": "^5.1.1", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.3", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.2", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/recursion-context": "^6.0.3", - "sebastian/type": "^5.1.3", - "sebastian/version": "^5.0.2", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", + "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -782,56 +775,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.31" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-02-18T12:37:06+00:00" + "time": "2026-07-06T14:54:16+00:00" }, { "name": "sebastian/cli-parser", - "version": "3.0.2", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -855,152 +832,51 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2026-05-17T05:29:34+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.3", + "version": "7.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" + "reference": "7c65c1e79836812819705b473a90c12399542485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", - "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0.3" }, "require-dev": { - "phpunit/phpunit": "^11.4" + "phpunit/phpunit": "^12.5.25" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -1008,7 +884,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -1048,7 +924,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" }, "funding": [ { @@ -1068,33 +944,33 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:26:40+00:00" + "time": "2026-05-21T04:45:25+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -1118,7 +994,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -1126,33 +1002,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1185,7 +1061,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -1193,27 +1069,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "8.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.5.26" }, "suggest": { "ext-posix": "*" @@ -1221,7 +1097,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -1249,7 +1125,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" }, "funding": [ { @@ -1269,34 +1145,34 @@ "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2026-05-25T13:40:20+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.2", + "version": "7.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1339,7 +1215,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" }, "funding": [ { @@ -1359,35 +1235,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:12:51+00:00" + "time": "2026-05-20T04:37:17+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.5.28" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -1413,41 +1289,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2026-06-01T15:10:33+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -1471,42 +1359,54 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2026-05-19T16:22:07+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1529,7 +1429,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -1537,32 +1437,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -1585,7 +1485,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -1593,32 +1493,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1649,7 +1549,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { @@ -1669,32 +1569,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:42:22+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "5.1.3", + "version": "6.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + "reference": "82ff822c2edc46724be9f7411d3163021f602773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -1718,7 +1618,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" }, "funding": [ { @@ -1738,29 +1638,29 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:55:48+00:00" + "time": "2026-05-20T06:45:45+00:00" }, { "name": "sebastian/version", - "version": "5.0.2", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -1784,7 +1684,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -1792,7 +1692,7 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { "name": "staabm/side-effects-detector", @@ -1848,16 +1748,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -1909,7 +1809,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -1929,20 +1829,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/process", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" + "reference": "f5804be144caceb570f6747519999636b664f24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", + "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", + "reference": "f5804be144caceb570f6747519999636b664f24c", "shasum": "" }, "require": { @@ -1974,7 +1874,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.8" + "source": "https://github.com/symfony/process/tree/v7.4.13" }, "funding": [ { @@ -1994,27 +1894,27 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-05-23T16:05:06+00:00" }, { "name": "theseer/tokenizer", - "version": "1.3.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -2036,7 +1936,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -2044,7 +1944,7 @@ "type": "github" } ], - "time": "2025-11-17T20:03:58+00:00" + "time": "2025-12-08T11:19:18+00:00" } ], "aliases": [], @@ -2055,7 +1955,7 @@ "platform": {}, "platform-dev": {}, "platform-overrides": { - "php": "8.2" + "php": "8.3" }, "plugin-api-version": "2.9.0" }