From 7593c478e91b294c607c870fc2108fb8fcebe093 Mon Sep 17 00:00:00 2001 From: ADmad Date: Sat, 13 Jul 2024 19:00:55 +0530 Subject: [PATCH] Fix error on PHP 8.4 PHP 8.4 adds a new interface method DatetimeImmutable::createFromTimestamp(). --- .github/workflows/ci.yml | 53 ++++++++++++++++++++++++++++++++++++++-- phpstan.neon | 5 ++++ src/Chronos.php | 16 +++++++++--- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b93c1e48..7a50b0c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,57 @@ permissions: jobs: testsuite: - uses: cakephp/.github/.github/workflows/testsuite-without-db.yml@5.x - secrets: inherit + runs-on: ubuntu-22.04 + continue-on-error: ${{ matrix.unstable }} + strategy: + fail-fast: false + matrix: + php-version: ['8.1'] + dependencies: [highest] + unstable: [false] + include: + - php-version: '8.1' + dependencies: lowest + unstable: false + - php-version: '8.2' + dependencies: highest + unstable: false + - php-version: '8.3' + dependencies: highest + unstable: false + - php-version: '8.4' + dependencies: highest + unstable: true + composer-options: "--ignore-platform-req=php" + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mbstring, intl + ini-values: zend.assertions=1 + coverage: pcov + + - name: Composer install + uses: ramsey/composer-install@v2 + with: + dependency-versions: ${{ matrix.dependencies }} + composer-options: ${{ matrix.composer-options }} + + - name: Run PHPUnit + run: | + if [[ ${{ matrix.php-version }} == '8.1' && ${{ matrix.dependencies }} == 'highest' ]]; then + export CODECOVERAGE=1 && vendor/bin/phpunit --display-deprecations --display-warnings --display-incomplete --display-skipped --coverage-clover=coverage.xml + else + vendor/bin/phpunit --display-deprecations --display-warnings + fi + + - name: Code Coverage Report + if: success() && matrix.php-version == '8.1' && matrix.dependencies == 'highest' + uses: codecov/codecov-action@v3 cs-stan: uses: cakephp/.github/.github/workflows/cs-stan.yml@5.x diff --git a/phpstan.neon b/phpstan.neon index c7daf7f0..c5d3522c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -7,3 +7,8 @@ parameters: - tests/bootstrap.php paths: - src/ + ignoreErrors: + - + message: "#^Call to an undefined static method DateTimeImmutable\\:\\:createFromTimestamp\\(\\)\\.$#" + count: 1 + path: src/Chronos.php diff --git a/src/Chronos.php b/src/Chronos.php index cf0c497b..b46391d0 100644 --- a/src/Chronos.php +++ b/src/Chronos.php @@ -736,13 +736,23 @@ public static function createFromArray(array $values): static /** * Create an instance from a timestamp * - * @param int $timestamp The timestamp to create an instance from. + * @param float|int $timestamp The timestamp to create an instance from. * @param \DateTimeZone|string|null $timezone The DateTimeZone object or timezone name the new instance should use. * @return static */ - public static function createFromTimestamp(int $timestamp, DateTimeZone|string|null $timezone = null): static + public static function createFromTimestamp(float|int $timestamp, DateTimeZone|string|null $timezone = null): static { - return static::now($timezone)->setTimestamp($timestamp); + if (PHP_VERSION_ID >= 80400 && $timezone === null) { + return parent::createFromTimestamp($timestamp); + } + + $instance = static::now($timezone); + + if (is_int($timestamp)) { + return $instance->setTimestamp($timestamp); + } + + return $instance->modify('@' . $timestamp); } /**