Initial commit
This commit is contained in:
25
vendor/symfony/clock/CHANGELOG.md
vendored
Normal file
25
vendor/symfony/clock/CHANGELOG.md
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
7.1
|
||||
---
|
||||
|
||||
* Add `DatePoint::getMicrosecond()` and `DatePoint::setMicrosecond()`
|
||||
|
||||
6.4
|
||||
---
|
||||
|
||||
* Add `DatePoint`: an immutable DateTime implementation with stricter error handling and return types
|
||||
* Throw `DateMalformedStringException`/`DateInvalidTimeZoneException` when appropriate
|
||||
* Add `$modifier` argument to the `now()` helper
|
||||
|
||||
6.3
|
||||
---
|
||||
|
||||
* Add `ClockAwareTrait` to help write time-sensitive classes
|
||||
* Add `Clock` class and `now()` function
|
||||
|
||||
6.2
|
||||
---
|
||||
|
||||
* Add the component
|
||||
89
vendor/symfony/clock/Clock.php
vendored
Normal file
89
vendor/symfony/clock/Clock.php
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
use Psr\Clock\ClockInterface as PsrClockInterface;
|
||||
|
||||
/**
|
||||
* A global clock.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class Clock implements ClockInterface
|
||||
{
|
||||
private static ClockInterface $globalClock;
|
||||
|
||||
public function __construct(
|
||||
private readonly ?PsrClockInterface $clock = null,
|
||||
private ?\DateTimeZone $timezone = null,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current global clock.
|
||||
*
|
||||
* Note that you should prefer injecting a ClockInterface or using
|
||||
* ClockAwareTrait when possible instead of using this method.
|
||||
*/
|
||||
public static function get(): ClockInterface
|
||||
{
|
||||
return self::$globalClock ??= new NativeClock();
|
||||
}
|
||||
|
||||
public static function set(PsrClockInterface $clock): void
|
||||
{
|
||||
self::$globalClock = $clock instanceof ClockInterface ? $clock : new self($clock);
|
||||
}
|
||||
|
||||
public function now(): DatePoint
|
||||
{
|
||||
$now = ($this->clock ?? self::get())->now();
|
||||
|
||||
if (!$now instanceof DatePoint) {
|
||||
$now = DatePoint::createFromInterface($now);
|
||||
}
|
||||
|
||||
return isset($this->timezone) ? $now->setTimezone($this->timezone) : $now;
|
||||
}
|
||||
|
||||
public function sleep(float|int $seconds): void
|
||||
{
|
||||
$clock = $this->clock ?? self::get();
|
||||
|
||||
if ($clock instanceof ClockInterface) {
|
||||
$clock->sleep($seconds);
|
||||
} else {
|
||||
(new NativeClock())->sleep($seconds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function withTimeZone(\DateTimeZone|string $timezone): static
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} elseif (\is_string($timezone)) {
|
||||
try {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
$clone = clone $this;
|
||||
$clone->timezone = $timezone;
|
||||
|
||||
return $clone;
|
||||
}
|
||||
}
|
||||
38
vendor/symfony/clock/ClockAwareTrait.php
vendored
Normal file
38
vendor/symfony/clock/ClockAwareTrait.php
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
use Psr\Clock\ClockInterface;
|
||||
use Symfony\Contracts\Service\Attribute\Required;
|
||||
|
||||
/**
|
||||
* A trait to help write time-sensitive classes.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
trait ClockAwareTrait
|
||||
{
|
||||
private readonly ClockInterface $clock;
|
||||
|
||||
#[Required]
|
||||
public function setClock(ClockInterface $clock): void
|
||||
{
|
||||
$this->clock = $clock;
|
||||
}
|
||||
|
||||
protected function now(): DatePoint
|
||||
{
|
||||
$now = ($this->clock ??= new Clock())->now();
|
||||
|
||||
return $now instanceof DatePoint ? $now : DatePoint::createFromInterface($now);
|
||||
}
|
||||
}
|
||||
24
vendor/symfony/clock/ClockInterface.php
vendored
Normal file
24
vendor/symfony/clock/ClockInterface.php
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
use Psr\Clock\ClockInterface as PsrClockInterface;
|
||||
|
||||
/**
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
interface ClockInterface extends PsrClockInterface
|
||||
{
|
||||
public function sleep(float|int $seconds): void;
|
||||
|
||||
public function withTimeZone(\DateTimeZone|string $timezone): static;
|
||||
}
|
||||
169
vendor/symfony/clock/DatePoint.php
vendored
Normal file
169
vendor/symfony/clock/DatePoint.php
vendored
Normal file
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
/**
|
||||
* An immmutable DateTime with stricter error handling and return types than the native one.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class DatePoint extends \DateTimeImmutable
|
||||
{
|
||||
/**
|
||||
* @throws \DateMalformedStringException When $datetime is invalid
|
||||
*/
|
||||
public function __construct(string $datetime = 'now', ?\DateTimeZone $timezone = null, ?parent $reference = null)
|
||||
{
|
||||
$now = $reference ?? Clock::get()->now();
|
||||
|
||||
if ('now' !== $datetime) {
|
||||
if (!$now instanceof static) {
|
||||
$now = static::createFromInterface($now);
|
||||
}
|
||||
|
||||
if (\PHP_VERSION_ID < 80300) {
|
||||
try {
|
||||
$builtInDate = new parent($datetime, $timezone ?? $now->getTimezone());
|
||||
$timezone = $builtInDate->getTimezone();
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateMalformedStringException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
} else {
|
||||
$builtInDate = new parent($datetime, $timezone ?? $now->getTimezone());
|
||||
$timezone = $builtInDate->getTimezone();
|
||||
}
|
||||
|
||||
$now = $now->setTimezone($timezone)->modify($datetime);
|
||||
|
||||
if ('00:00:00.000000' === $builtInDate->format('H:i:s.u')) {
|
||||
$now = $now->setTime(0, 0);
|
||||
}
|
||||
} elseif (null !== $timezone) {
|
||||
$now = $now->setTimezone($timezone);
|
||||
}
|
||||
|
||||
$this->__unserialize((array) $now);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateMalformedStringException When $format or $datetime are invalid
|
||||
*/
|
||||
public static function createFromFormat(string $format, string $datetime, ?\DateTimeZone $timezone = null): static
|
||||
{
|
||||
return parent::createFromFormat($format, $datetime, $timezone) ?: throw new \DateMalformedStringException(static::getLastErrors()['errors'][0] ?? 'Invalid date string or format.');
|
||||
}
|
||||
|
||||
public static function createFromInterface(\DateTimeInterface $object): static
|
||||
{
|
||||
return parent::createFromInterface($object);
|
||||
}
|
||||
|
||||
public static function createFromMutable(\DateTime $object): static
|
||||
{
|
||||
return parent::createFromMutable($object);
|
||||
}
|
||||
|
||||
public static function createFromTimestamp(int|float $timestamp): static
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80400) {
|
||||
return parent::createFromTimestamp($timestamp);
|
||||
}
|
||||
|
||||
if (\is_int($timestamp) || !$ms = (int) $timestamp - $timestamp) {
|
||||
return static::createFromFormat('U', (string) $timestamp);
|
||||
}
|
||||
|
||||
if (!is_finite($timestamp) || \PHP_INT_MAX + 1.0 <= $timestamp || \PHP_INT_MIN > $timestamp) {
|
||||
throw new \DateRangeError(\sprintf('DateTimeImmutable::createFromTimestamp(): Argument #1 ($timestamp) must be a finite number between %s and %s.999999, %s given', \PHP_INT_MIN, \PHP_INT_MAX, $timestamp));
|
||||
}
|
||||
|
||||
if ($timestamp < 0) {
|
||||
$timestamp = (int) $timestamp - 2.0 + $ms;
|
||||
}
|
||||
|
||||
return static::createFromFormat('U.u', \sprintf('%.6F', $timestamp));
|
||||
}
|
||||
|
||||
public function add(\DateInterval $interval): static
|
||||
{
|
||||
return parent::add($interval);
|
||||
}
|
||||
|
||||
public function sub(\DateInterval $interval): static
|
||||
{
|
||||
return parent::sub($interval);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateMalformedStringException When $modifier is invalid
|
||||
*/
|
||||
public function modify(string $modifier): static
|
||||
{
|
||||
if (\PHP_VERSION_ID < 80300) {
|
||||
return @parent::modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s".', $modifier));
|
||||
}
|
||||
|
||||
return parent::modify($modifier);
|
||||
}
|
||||
|
||||
public function setTimestamp(int $value): static
|
||||
{
|
||||
return parent::setTimestamp($value);
|
||||
}
|
||||
|
||||
public function setDate(int $year, int $month, int $day): static
|
||||
{
|
||||
return parent::setDate($year, $month, $day);
|
||||
}
|
||||
|
||||
public function setISODate(int $year, int $week, int $day = 1): static
|
||||
{
|
||||
return parent::setISODate($year, $week, $day);
|
||||
}
|
||||
|
||||
public function setTime(int $hour, int $minute, int $second = 0, int $microsecond = 0): static
|
||||
{
|
||||
return parent::setTime($hour, $minute, $second, $microsecond);
|
||||
}
|
||||
|
||||
public function setTimezone(\DateTimeZone $timezone): static
|
||||
{
|
||||
return parent::setTimezone($timezone);
|
||||
}
|
||||
|
||||
public function getTimezone(): \DateTimeZone
|
||||
{
|
||||
return parent::getTimezone() ?: throw new \DateInvalidTimeZoneException('The DatePoint object has no timezone.');
|
||||
}
|
||||
|
||||
public function setMicrosecond(int $microsecond): static
|
||||
{
|
||||
if ($microsecond < 0 || $microsecond > 999999) {
|
||||
throw new \DateRangeError('DatePoint::setMicrosecond(): Argument #1 ($microsecond) must be between 0 and 999999, '.$microsecond.' given');
|
||||
}
|
||||
|
||||
if (\PHP_VERSION_ID < 80400) {
|
||||
return $this->setTime(...explode('.', $this->format('H.i.s.'.$microsecond)));
|
||||
}
|
||||
|
||||
return parent::setMicrosecond($microsecond);
|
||||
}
|
||||
|
||||
public function getMicrosecond(): int
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80400) {
|
||||
return parent::getMicrosecond();
|
||||
}
|
||||
|
||||
return $this->format('u');
|
||||
}
|
||||
}
|
||||
19
vendor/symfony/clock/LICENSE
vendored
Normal file
19
vendor/symfony/clock/LICENSE
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2022-present Fabien Potencier
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
98
vendor/symfony/clock/MockClock.php
vendored
Normal file
98
vendor/symfony/clock/MockClock.php
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
/**
|
||||
* A clock that always returns the same date, suitable for testing time-sensitive logic.
|
||||
*
|
||||
* Consider using ClockSensitiveTrait in your test cases instead of using this class directly.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class MockClock implements ClockInterface
|
||||
{
|
||||
private DatePoint $now;
|
||||
|
||||
/**
|
||||
* @throws \DateMalformedStringException When $now is invalid
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function __construct(\DateTimeImmutable|string $now = 'now', \DateTimeZone|string|null $timezone = null)
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} elseif (\is_string($timezone)) {
|
||||
try {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
if (\is_string($now)) {
|
||||
$now = new DatePoint($now, $timezone ?? new \DateTimeZone('UTC'));
|
||||
} elseif (!$now instanceof DatePoint) {
|
||||
$now = DatePoint::createFromInterface($now);
|
||||
}
|
||||
|
||||
$this->now = null !== $timezone ? $now->setTimezone($timezone) : $now;
|
||||
}
|
||||
|
||||
public function now(): DatePoint
|
||||
{
|
||||
return clone $this->now;
|
||||
}
|
||||
|
||||
public function sleep(float|int $seconds): void
|
||||
{
|
||||
$now = (float) $this->now->format('Uu') + $seconds * 1e6;
|
||||
$now = substr_replace(\sprintf('@%07.0F', $now), '.', -6, 0);
|
||||
$timezone = $this->now->getTimezone();
|
||||
|
||||
$this->now = DatePoint::createFromInterface(new \DateTimeImmutable($now, $timezone))->setTimezone($timezone);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateMalformedStringException When $modifier is invalid
|
||||
*/
|
||||
public function modify(string $modifier): void
|
||||
{
|
||||
if (\PHP_VERSION_ID < 80300) {
|
||||
$this->now = @$this->now->modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s". Could not modify MockClock.', $modifier));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->now = $this->now->modify($modifier);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When the timezone name is invalid
|
||||
*/
|
||||
public function withTimeZone(\DateTimeZone|string $timezone): static
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} elseif (\is_string($timezone)) {
|
||||
try {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
$clone = clone $this;
|
||||
$clone->now = $clone->now->setTimezone($timezone);
|
||||
|
||||
return $clone;
|
||||
}
|
||||
}
|
||||
93
vendor/symfony/clock/MonotonicClock.php
vendored
Normal file
93
vendor/symfony/clock/MonotonicClock.php
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
/**
|
||||
* A monotonic clock suitable for performance profiling.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class MonotonicClock implements ClockInterface
|
||||
{
|
||||
private int $sOffset;
|
||||
private int $usOffset;
|
||||
private \DateTimeZone $timezone;
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function __construct(\DateTimeZone|string|null $timezone = null)
|
||||
{
|
||||
if (false === $offset = hrtime()) {
|
||||
throw new \RuntimeException('hrtime() returned false: the runtime environment does not provide access to a monotonic timer.');
|
||||
}
|
||||
|
||||
$time = explode(' ', microtime(), 2);
|
||||
$this->sOffset = $time[1] - $offset[0];
|
||||
$this->usOffset = (int) ($time[0] * 1000000) - (int) ($offset[1] / 1000);
|
||||
|
||||
$this->timezone = \is_string($timezone ??= date_default_timezone_get()) ? $this->withTimeZone($timezone)->timezone : $timezone;
|
||||
}
|
||||
|
||||
public function now(): DatePoint
|
||||
{
|
||||
[$s, $us] = hrtime();
|
||||
|
||||
if (1000000 <= $us = (int) ($us / 1000) + $this->usOffset) {
|
||||
++$s;
|
||||
$us -= 1000000;
|
||||
} elseif (0 > $us) {
|
||||
--$s;
|
||||
$us += 1000000;
|
||||
}
|
||||
|
||||
if (6 !== \strlen($now = (string) $us)) {
|
||||
$now = str_pad($now, 6, '0', \STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
$now = '@'.($s + $this->sOffset).'.'.$now;
|
||||
|
||||
return DatePoint::createFromInterface(new \DateTimeImmutable($now, $this->timezone))->setTimezone($this->timezone);
|
||||
}
|
||||
|
||||
public function sleep(float|int $seconds): void
|
||||
{
|
||||
if (0 < $s = (int) $seconds) {
|
||||
sleep($s);
|
||||
}
|
||||
|
||||
if (0 < $us = $seconds - $s) {
|
||||
usleep((int) ($us * 1E6));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function withTimeZone(\DateTimeZone|string $timezone): static
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} elseif (\is_string($timezone)) {
|
||||
try {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
$clone = clone $this;
|
||||
$clone->timezone = $timezone;
|
||||
|
||||
return $clone;
|
||||
}
|
||||
}
|
||||
67
vendor/symfony/clock/NativeClock.php
vendored
Normal file
67
vendor/symfony/clock/NativeClock.php
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
/**
|
||||
* A clock that relies the system time.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class NativeClock implements ClockInterface
|
||||
{
|
||||
private \DateTimeZone $timezone;
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function __construct(\DateTimeZone|string|null $timezone = null)
|
||||
{
|
||||
$this->timezone = \is_string($timezone ??= date_default_timezone_get()) ? $this->withTimeZone($timezone)->timezone : $timezone;
|
||||
}
|
||||
|
||||
public function now(): DatePoint
|
||||
{
|
||||
return DatePoint::createFromInterface(new \DateTimeImmutable('now', $this->timezone));
|
||||
}
|
||||
|
||||
public function sleep(float|int $seconds): void
|
||||
{
|
||||
if (0 < $s = (int) $seconds) {
|
||||
sleep($s);
|
||||
}
|
||||
|
||||
if (0 < $us = $seconds - $s) {
|
||||
usleep((int) ($us * 1E6));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \DateInvalidTimeZoneException When $timezone is invalid
|
||||
*/
|
||||
public function withTimeZone(\DateTimeZone|string $timezone): static
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} elseif (\is_string($timezone)) {
|
||||
try {
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
} catch (\Exception $e) {
|
||||
throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
$clone = clone $this;
|
||||
$clone->timezone = $timezone;
|
||||
|
||||
return $clone;
|
||||
}
|
||||
}
|
||||
47
vendor/symfony/clock/README.md
vendored
Normal file
47
vendor/symfony/clock/README.md
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
Clock Component
|
||||
===============
|
||||
|
||||
Symfony Clock decouples applications from the system clock.
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
```bash
|
||||
composer require symfony/clock
|
||||
```
|
||||
|
||||
```php
|
||||
use Symfony\Component\Clock\NativeClock;
|
||||
use Symfony\Component\Clock\ClockInterface;
|
||||
|
||||
class MyClockSensitiveClass
|
||||
{
|
||||
public function __construct(
|
||||
private ClockInterface $clock,
|
||||
) {
|
||||
// Only if you need to force a timezone:
|
||||
//$this->clock = $clock->withTimeZone('UTC');
|
||||
}
|
||||
|
||||
public function doSomething()
|
||||
{
|
||||
$now = $this->clock->now();
|
||||
// [...] do something with $now, which is a \DateTimeImmutable object
|
||||
|
||||
$this->clock->sleep(2.5); // Pause execution for 2.5 seconds
|
||||
}
|
||||
}
|
||||
|
||||
$clock = new NativeClock();
|
||||
$service = new MyClockSensitiveClass($clock);
|
||||
$service->doSomething();
|
||||
```
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
* [Documentation](https://symfony.com/doc/current/components/clock.html)
|
||||
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
|
||||
* [Report issues](https://github.com/symfony/symfony/issues) and
|
||||
[send Pull Requests](https://github.com/symfony/symfony/pulls)
|
||||
in the [main Symfony repository](https://github.com/symfony/symfony)
|
||||
28
vendor/symfony/clock/Resources/now.php
vendored
Normal file
28
vendor/symfony/clock/Resources/now.php
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock;
|
||||
|
||||
if (!\function_exists(now::class)) {
|
||||
/**
|
||||
* @throws \DateMalformedStringException When the modifier is invalid
|
||||
*/
|
||||
function now(string $modifier = 'now'): DatePoint
|
||||
{
|
||||
if ('now' !== $modifier) {
|
||||
return new DatePoint($modifier);
|
||||
}
|
||||
|
||||
$now = Clock::get()->now();
|
||||
|
||||
return $now instanceof DatePoint ? $now : DatePoint::createFromInterface($now);
|
||||
}
|
||||
}
|
||||
77
vendor/symfony/clock/Test/ClockSensitiveTrait.php
vendored
Normal file
77
vendor/symfony/clock/Test/ClockSensitiveTrait.php
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Clock\Test;
|
||||
|
||||
use PHPUnit\Framework\Attributes\After;
|
||||
use PHPUnit\Framework\Attributes\Before;
|
||||
use PHPUnit\Framework\Attributes\BeforeClass;
|
||||
use Symfony\Component\Clock\Clock;
|
||||
use Symfony\Component\Clock\ClockInterface;
|
||||
use Symfony\Component\Clock\MockClock;
|
||||
|
||||
use function Symfony\Component\Clock\now;
|
||||
|
||||
/**
|
||||
* Helps with mocking the time in your test cases.
|
||||
*
|
||||
* This trait provides one self::mockTime() method that freezes the time.
|
||||
* It restores the global clock after each test case.
|
||||
* self::mockTime() accepts either a string (eg '+1 days' or '2022-12-22'),
|
||||
* a DateTimeImmutable, or a boolean (to freeze/restore the global clock).
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
trait ClockSensitiveTrait
|
||||
{
|
||||
public static function mockTime(string|\DateTimeImmutable|bool $when = true): ClockInterface
|
||||
{
|
||||
Clock::set(match (true) {
|
||||
false === $when => self::saveClockBeforeTest(false),
|
||||
true === $when => new MockClock(),
|
||||
$when instanceof \DateTimeImmutable => new MockClock($when),
|
||||
default => new MockClock(now($when)),
|
||||
});
|
||||
|
||||
return Clock::get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @beforeClass
|
||||
*
|
||||
* @before
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
#[Before]
|
||||
#[BeforeClass]
|
||||
public static function saveClockBeforeTest(bool $save = true): ClockInterface
|
||||
{
|
||||
static $originalClock;
|
||||
|
||||
if ($save && $originalClock) {
|
||||
self::restoreClockAfterTest();
|
||||
}
|
||||
|
||||
return $save ? $originalClock = Clock::get() : $originalClock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @after
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
#[After]
|
||||
protected static function restoreClockAfterTest(): void
|
||||
{
|
||||
Clock::set(self::saveClockBeforeTest(false));
|
||||
}
|
||||
}
|
||||
34
vendor/symfony/clock/composer.json
vendored
Normal file
34
vendor/symfony/clock/composer.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "symfony/clock",
|
||||
"type": "library",
|
||||
"description": "Decouples applications from the system clock",
|
||||
"keywords": ["clock", "time", "psr20"],
|
||||
"homepage": "https://symfony.com",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"provide": {
|
||||
"psr/clock-implementation": "1.0"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.2",
|
||||
"psr/clock": "^1.0",
|
||||
"symfony/polyfill-php83": "^1.28"
|
||||
},
|
||||
"autoload": {
|
||||
"files": [ "Resources/now.php" ],
|
||||
"psr-4": { "Symfony\\Component\\Clock\\": "" },
|
||||
"exclude-from-classmap": [
|
||||
"/Tests/"
|
||||
]
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
||||
Reference in New Issue
Block a user