allow vendord
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 3m3s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
Build, Push and Deploy / deploy-staging (push) Successful in 32s
Build, Push and Deploy / deploy-production (push) Has been skipped
Build, Push and Deploy / cleanup (push) Successful in 1s
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 3m3s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
Build, Push and Deploy / deploy-staging (push) Successful in 32s
Build, Push and Deploy / deploy-production (push) Has been skipped
Build, Push and Deploy / cleanup (push) Successful in 1s
This commit is contained in:
15
vendor/beste/clock/.github/dependabot.yml
vendored
Normal file
15
vendor/beste/clock/.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
commit-message:
|
||||
include: "scope"
|
||||
prefix: "github-actions"
|
||||
open-pull-requests-limit: 10
|
||||
labels:
|
||||
- "dependency"
|
||||
2
vendor/beste/clock/.github/settings.yml
vendored
Normal file
2
vendor/beste/clock/.github/settings.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# https://probot.github.io/apps/settings/
|
||||
_extends: beste/.github
|
||||
23
vendor/beste/clock/.github/workflows/dependabot-auto-merge.yml
vendored
Normal file
23
vendor/beste/clock/.github/workflows/dependabot-auto-merge.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
name: "Dependabot auto-merge"
|
||||
|
||||
on: [pull_request_target] # yamllint disable-line rule:truthy
|
||||
|
||||
permissions:
|
||||
contents: "write"
|
||||
|
||||
jobs:
|
||||
dependabot:
|
||||
runs-on: "ubuntu-latest"
|
||||
if: "${{ github.actor == 'dependabot[bot]' }}"
|
||||
steps:
|
||||
- name: "Dependabot metadata"
|
||||
id: "metadata"
|
||||
uses: "dependabot/fetch-metadata@v1.3.5"
|
||||
with:
|
||||
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
- name: "Enable auto-merge for Dependabot PRs"
|
||||
if: "${{ steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major' }}"
|
||||
run: "gh pr merge --auto --merge \"$PR_URL\""
|
||||
env:
|
||||
PR_URL: "${{github.event.pull_request.html_url}}"
|
||||
GITHUB_TOKEN: "${{secrets.GITHUB_TOKEN}}"
|
||||
50
vendor/beste/clock/.github/workflows/tests.yml
vendored
Normal file
50
vendor/beste/clock/.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- '1.x'
|
||||
- '2.x'
|
||||
- '3.x'
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: PHP ${{ matrix.php }}
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php:
|
||||
- "8.0"
|
||||
- "8.1"
|
||||
- "8.2"
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
tools: composer:v2
|
||||
coverage: xdebug
|
||||
env:
|
||||
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- uses: "ramsey/composer-install@v2"
|
||||
|
||||
- name: Setup problem matchers for PHP
|
||||
run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
|
||||
|
||||
- name: Run PHPStan
|
||||
run: vendor/bin/phpstan analyse --error-format=github
|
||||
|
||||
- name: Run Psalm
|
||||
run: vendor/bin/psalm --output-format=github
|
||||
|
||||
- name: Setup Problem Matchers for PHPUnit
|
||||
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
|
||||
|
||||
- name: Run PHPUnit
|
||||
run: vendor/bin/phpunit --testdox --coverage-text
|
||||
24
vendor/beste/clock/CHANGELOG.md
vendored
Normal file
24
vendor/beste/clock/CHANGELOG.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 3.0.0 - 2022-11-26
|
||||
This release replaces `stella-maris/clock` with `psr/clock`.
|
||||
|
||||
## 2.3.1 - 2022-11-25
|
||||
This release reverts the change to implement `psr/clock` directly, to not break dependents who rely on `stella-maris/clock`
|
||||
|
||||
## 2.3.0 - 2022-11-25
|
||||
This release re-introduces support for PHP ^8.0 and implements the freshly released `psr/clock` (PSR-20) directly.
|
||||
|
||||
## 2.2.0 - 2022-11-04
|
||||
This release drops support for PHP <8.1.
|
||||
|
||||
## 2.1.0 - 2022-04-22
|
||||
Adds the `WrappingClock` which allows using an object with a `now()` method returning a `DateTimeImmutable` object
|
||||
as a "real" clock.
|
||||
|
||||
## 2.0.0 - 2022-04-20
|
||||
This release introduces a compatibility layer with the PSR-20 draft, allowing us to already
|
||||
get some interoperability by depending on a shared interface.
|
||||
|
||||
## 1.0.0 - 2021-12-10
|
||||
Initial Release
|
||||
21
vendor/beste/clock/LICENSE
vendored
Normal file
21
vendor/beste/clock/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Jérôme Gamez, https://github.com/beste <jerome@gamez.name>
|
||||
|
||||
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.
|
||||
182
vendor/beste/clock/README.md
vendored
Normal file
182
vendor/beste/clock/README.md
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
# Clock
|
||||
|
||||
[](https://packagist.org/packages/beste/clock)
|
||||
[](https://packagist.org/packages/beste/clock)
|
||||
[](https://github.com/beste/clock/actions/workflows/tests.yml)
|
||||
|
||||
A collection of Clock implementations.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Installation](#installation)
|
||||
- [Clocks](#clocks)
|
||||
- [`SystemClock`](#systemclock) - Time, as your computer (k)nows it
|
||||
- [`LocalizedClock`](#localizedclock) - A clock in a(nother) time zone
|
||||
- [`UTCClock`](#utcclock) - The clock that you should™ use
|
||||
- [`FrozenClock`](#frozenclock) - A clock that stopped moving (perfect for tests)
|
||||
- [`MinuteClock`](#minuteclock) - Who cares about seconds or even less?
|
||||
- [`WrappingClock`](#wrappingclock) - Allows wrapping a non-clock with a `now()` method in a clock
|
||||
- [Running Tests](#running-tests)
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
composer require beste/clock
|
||||
```
|
||||
|
||||
## Clocks
|
||||
|
||||
### `SystemClock`
|
||||
|
||||
A System Clock will return a time just as if you would use `new DateTimeImmutable()`. The time zone of the returned
|
||||
value is determined by the clock's environment, for example by the time zone that has been configured in your
|
||||
application, by a previously used `date_default_timezone_set()` or by the value of `date.timezone` in the
|
||||
`php.ini`. If none of these are explicitly set, it uses the `UTC` timezone.
|
||||
|
||||
```php
|
||||
# examples/system_clock.php
|
||||
|
||||
use Beste\Clock\SystemClock;
|
||||
|
||||
$clock = SystemClock::create();
|
||||
|
||||
printf("On your system, the current date and time is %s\n", $clock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
|
||||
date_default_timezone_set('America/Los_Angeles');
|
||||
|
||||
printf("Now it's %s\n", $clock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
|
||||
date_default_timezone_set('Europe/Berlin');
|
||||
|
||||
printf("Now it's %s\n", $clock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
```
|
||||
|
||||
### `LocalizedClock`
|
||||
|
||||
A localized clock is aware of the time zone in which it is located. While the time zone of the `SystemClock` is
|
||||
determined from the environment (your PHP configuration), this clock uses the time zone that you initialize it with.
|
||||
|
||||
```php
|
||||
# examples/localized_clock.php
|
||||
|
||||
use Beste\Clock\LocalizedClock;
|
||||
|
||||
$berlin = LocalizedClock::in('Europe/Berlin');
|
||||
$denver = LocalizedClock::in(new DateTimeZone('America/Denver'));
|
||||
|
||||
printf("Berlin: %s\n", $berlin->now()->format('Y-m-d H:i:s T (P)'));
|
||||
printf("Denver: %s\n", $denver->now()->format('Y-m-d H:i:s T (P)'));
|
||||
```
|
||||
|
||||
### `UTCClock`
|
||||
|
||||
`UTC` is the abbreviation for [Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)
|
||||
and a special kind of time zone that is not affected by daylight saving time. It is commonly used for the communication
|
||||
of time across different systems (e.g. between your PHP application and a database, or between a backend
|
||||
and a frontend). An `UTCClock` instance behaves exactly the same as an instance of `LocalizedClock::in('UTC')`.
|
||||
|
||||
```php
|
||||
# examples/utc_clock.php
|
||||
|
||||
use Beste\Clock\UTCClock;
|
||||
|
||||
$clock = UTCClock::create();
|
||||
|
||||
$anotherTimeZone = 'Africa/Casablanca';
|
||||
|
||||
date_default_timezone_set($anotherTimeZone);
|
||||
|
||||
printf("The system time zone is %s.\n", $anotherTimeZone);
|
||||
printf("The clock's time zone is %s.\n", $clock->now()->getTimezone()->getName());
|
||||
```
|
||||
|
||||
### `FrozenClock`
|
||||
|
||||
A frozen clock doesn't move - the time we set it with will stay the same... unless we change it. That makes the
|
||||
frozen clock perfect for testing the behaviour of your time-based use cases, for example in Unit Tests.
|
||||
|
||||
```php
|
||||
# examples/frozen_clock.php
|
||||
|
||||
use Beste\Clock\FrozenClock;
|
||||
use Beste\Clock\SystemClock;
|
||||
|
||||
$frozenClock = FrozenClock::withNowFrom(SystemClock::create());
|
||||
|
||||
printf("\nThe clock is frozen at %s", $frozenClock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
printf("\nLet's wait a second…");
|
||||
sleep(1);
|
||||
printf("\nIt's one second later, but the clock is still frozen at %s", $frozenClock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
|
||||
$frozenClock->setTo($frozenClock->now()->modify('-5 minutes'));
|
||||
printf("\nAfter turning back the clock 5 minutes, it's %s", $frozenClock->now()->format('Y-m-d H:i:s T (P)'));
|
||||
```
|
||||
|
||||
### `MinuteClock`
|
||||
|
||||
In some cases, microseconds, milliseconds, or even seconds are too precise for some use cases - sometimes it's just
|
||||
enough if something happened in the same minute. Using the minute
|
||||
|
||||
```php
|
||||
# examples/minute_clock.php
|
||||
|
||||
use Beste\Clock\FrozenClock;
|
||||
use Beste\Clock\MinuteClock;
|
||||
|
||||
$frozenClock = FrozenClock::at(new DateTimeImmutable('01:23:45'));
|
||||
$clock = MinuteClock::wrapping($frozenClock);
|
||||
|
||||
printf("For %s, the minute clock returns %s\n",
|
||||
$frozenClock->now()->format('H:i:s'),
|
||||
$clock->now()->format('H:i:s')
|
||||
);
|
||||
|
||||
$frozenClock->setTo($frozenClock->now()->modify('+10 seconds')); // 01:23:55
|
||||
|
||||
printf("For %s, the minute clock still returns %s\n",
|
||||
$frozenClock->now()->format('H:i:s'),
|
||||
$clock->now()->format('H:i:s')
|
||||
);
|
||||
```
|
||||
|
||||
### `WrappingClock`
|
||||
|
||||
If you already have an object with a `now()` method returning a `DateTimeImmutable` object, you can wrap it
|
||||
in a `WrappingClock` to make it a "real" Clock.
|
||||
|
||||
as a "real" clock.
|
||||
|
||||
```php
|
||||
# examples/wrapping_clock.php
|
||||
|
||||
use Beste\Clock\WrappingClock;
|
||||
|
||||
// Create a frozen $now so that we can test the wrapping clock.
|
||||
$now = new DateTimeImmutable('2012-04-24 12:00:00');
|
||||
|
||||
// Create an object that is NOT a clock, but has a now() method returning the frozen $now.
|
||||
$clock = new class($now) {
|
||||
private \DateTimeImmutable $now;
|
||||
|
||||
public function __construct(\DateTimeImmutable $now)
|
||||
{
|
||||
$this->now = $now;
|
||||
}
|
||||
|
||||
public function now(): \DateTimeImmutable
|
||||
{
|
||||
return $this->now;
|
||||
}
|
||||
};
|
||||
|
||||
// We can now wrap the object in a clock.
|
||||
$wrappedClock = WrappingClock::wrapping($clock);
|
||||
|
||||
assert($now->format(DATE_ATOM) === $wrappedClock->now()->format(DATE_ATOM));
|
||||
```
|
||||
|
||||
## Running tests
|
||||
|
||||
```shell
|
||||
composer test
|
||||
```
|
||||
58
vendor/beste/clock/composer.json
vendored
Normal file
58
vendor/beste/clock/composer.json
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"name": "beste/clock",
|
||||
"type": "library",
|
||||
"description": "A collection of Clock implementations",
|
||||
"keywords": ["clock", "clock-interface", "psr20", "psr-20"],
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jérôme Gamez",
|
||||
"email": "jerome@gamez.name"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.0",
|
||||
"psr/clock": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/extension-installer": "^1.2",
|
||||
"phpstan/phpstan": "^1.9.1",
|
||||
"phpstan/phpstan-phpunit": "^1.2.2",
|
||||
"phpstan/phpstan-strict-rules": "^1.4.4",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"psalm/plugin-phpunit": "^0.16.1",
|
||||
"vimeo/psalm": "^4.29"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Beste\\Clock\\": "src/Clock"
|
||||
},
|
||||
"files": [
|
||||
"src/Clock.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Beste\\Clock\\Tests\\": "tests/Clock"
|
||||
}
|
||||
},
|
||||
"provide": {
|
||||
"psr/clock-implementation": "1.0"
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"phpstan/extension-installer": true
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"test": [
|
||||
"@phpstan",
|
||||
"@psalm",
|
||||
"@phpunit"
|
||||
],
|
||||
"phpunit": "vendor/bin/phpunit",
|
||||
"phpstan": "vendor/bin/phpstan analyse",
|
||||
"psalm": "vendor/bin/psalm"
|
||||
}
|
||||
}
|
||||
12
vendor/beste/clock/src/Clock.php
vendored
Normal file
12
vendor/beste/clock/src/Clock.php
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste;
|
||||
|
||||
use Psr\Clock\ClockInterface;
|
||||
|
||||
interface Clock extends ClockInterface
|
||||
{
|
||||
|
||||
}
|
||||
47
vendor/beste/clock/src/Clock/FrozenClock.php
vendored
Normal file
47
vendor/beste/clock/src/Clock/FrozenClock.php
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
use Psr\Clock\ClockInterface;
|
||||
|
||||
final class FrozenClock implements Clock
|
||||
{
|
||||
private DateTimeImmutable $frozenAt;
|
||||
|
||||
private function __construct(DateTimeImmutable $frozenAt)
|
||||
{
|
||||
$this->frozenAt = $frozenAt;
|
||||
}
|
||||
|
||||
public static function at(DateTimeImmutable $time): self
|
||||
{
|
||||
return new self($time);
|
||||
}
|
||||
|
||||
public static function withNowFrom(ClockInterface $clock): self
|
||||
{
|
||||
return new self($clock->now());
|
||||
}
|
||||
|
||||
public static function fromUTC(): self
|
||||
{
|
||||
return new self(new DateTimeImmutable('now', new DateTimeZone('UTC')));
|
||||
}
|
||||
|
||||
public function setTo(DateTimeImmutable $time): self
|
||||
{
|
||||
$this->frozenAt = $time;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return clone $this->frozenAt;
|
||||
}
|
||||
}
|
||||
42
vendor/beste/clock/src/Clock/LocalizedClock.php
vendored
Normal file
42
vendor/beste/clock/src/Clock/LocalizedClock.php
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
use InvalidArgumentException;
|
||||
use Throwable;
|
||||
|
||||
final class LocalizedClock implements Clock
|
||||
{
|
||||
private DateTimeZone $timeZone;
|
||||
|
||||
private function __construct(DateTimeZone $timeZone)
|
||||
{
|
||||
$this->timeZone = $timeZone;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DateTimeZone|string $timeZone
|
||||
*/
|
||||
public static function in($timeZone): self
|
||||
{
|
||||
if (is_string($timeZone)) {
|
||||
try {
|
||||
$timeZone = new DateTimeZone($timeZone);
|
||||
} catch (Throwable $e) {
|
||||
throw new InvalidArgumentException($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
return new self($timeZone);
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return new DateTimeImmutable('now', $this->timeZone);
|
||||
}
|
||||
}
|
||||
37
vendor/beste/clock/src/Clock/MinuteClock.php
vendored
Normal file
37
vendor/beste/clock/src/Clock/MinuteClock.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
use Psr\Clock\ClockInterface;
|
||||
|
||||
final class MinuteClock implements Clock
|
||||
{
|
||||
private ClockInterface $clock;
|
||||
|
||||
private function __construct(ClockInterface $clock)
|
||||
{
|
||||
$this->clock = $clock;
|
||||
}
|
||||
|
||||
public static function wrapping(ClockInterface $clock): self
|
||||
{
|
||||
return new self($clock);
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return $this->floor($this->clock->now());
|
||||
}
|
||||
|
||||
private function floor(DateTimeImmutable $now): DateTimeImmutable
|
||||
{
|
||||
return $now->setTime(
|
||||
(int) $now->format('H'),
|
||||
(int) $now->format('i')
|
||||
);
|
||||
}
|
||||
}
|
||||
25
vendor/beste/clock/src/Clock/SystemClock.php
vendored
Normal file
25
vendor/beste/clock/src/Clock/SystemClock.php
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
|
||||
final class SystemClock implements Clock
|
||||
{
|
||||
private function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public static function create(): self
|
||||
{
|
||||
return new self();
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return new DateTimeImmutable();
|
||||
}
|
||||
}
|
||||
29
vendor/beste/clock/src/Clock/UTCClock.php
vendored
Normal file
29
vendor/beste/clock/src/Clock/UTCClock.php
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
|
||||
final class UTCClock implements Clock
|
||||
{
|
||||
private DateTimeZone $timeZone;
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
$this->timeZone = new DateTimeZone('UTC');
|
||||
}
|
||||
|
||||
public static function create(): self
|
||||
{
|
||||
return new self();
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return new DateTimeImmutable('now', $this->timeZone);
|
||||
}
|
||||
}
|
||||
61
vendor/beste/clock/src/Clock/WrappingClock.php
vendored
Normal file
61
vendor/beste/clock/src/Clock/WrappingClock.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Beste\Clock;
|
||||
|
||||
use Beste\Clock;
|
||||
use DateTimeImmutable;
|
||||
use Psr\Clock\ClockInterface;
|
||||
|
||||
final class WrappingClock implements Clock
|
||||
{
|
||||
private ClockInterface $wrappedClock;
|
||||
|
||||
private function __construct(ClockInterface $wrappedClock)
|
||||
{
|
||||
$this->wrappedClock = $wrappedClock;
|
||||
}
|
||||
|
||||
public static function wrapping(object $clock): self
|
||||
{
|
||||
if ($clock instanceof ClockInterface) {
|
||||
return new self($clock);
|
||||
}
|
||||
|
||||
if (!method_exists($clock, 'now')) {
|
||||
throw new \InvalidArgumentException('$clock must implement StellaMaris\Clock\ClockInterface or have a now() method');
|
||||
}
|
||||
|
||||
if (!($clock->now() instanceof DateTimeImmutable)) {
|
||||
throw new \InvalidArgumentException('$clock->now() must return a DateTimeImmutable');
|
||||
}
|
||||
|
||||
$wrappedClock = new class($clock) implements ClockInterface {
|
||||
private object $clock;
|
||||
|
||||
public function __construct(object $clock)
|
||||
{
|
||||
$this->clock = $clock;
|
||||
}
|
||||
|
||||
public function now(): \DateTimeImmutable
|
||||
{
|
||||
assert(method_exists($this->clock, 'now'));
|
||||
|
||||
$now = $this->clock->now();
|
||||
|
||||
assert($now instanceof \DateTimeImmutable);
|
||||
|
||||
return $now;
|
||||
}
|
||||
};
|
||||
|
||||
return new self($wrappedClock);
|
||||
}
|
||||
|
||||
public function now(): DateTimeImmutable
|
||||
{
|
||||
return $this->wrappedClock->now();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user