Skip to content

Commit 835fbe0

Browse files
authored
added PSR-16 adapter (#77)
1 parent a76a5d6 commit 835fbe0

8 files changed

+317
-1
lines changed

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"nette/di": "^3.1 || ^4.0",
2424
"latte/latte": "^3.0.12",
2525
"tracy/tracy": "^2.9",
26-
"phpstan/phpstan": "^1.0"
26+
"phpstan/phpstan": "^1.0",
27+
"psr/simple-cache": "^2.0 || ^3.0"
2728
},
2829
"conflict": {
2930
"latte/latte": "<3.0.12"

src/Bridges/Psr/PsrCacheAdapter.php

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the Tracy (https://tracy.nette.org)
5+
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Nette\Bridges\Psr;
11+
12+
use DateInterval;
13+
use DateTimeImmutable;
14+
use Generator;
15+
use Nette;
16+
use Psr;
17+
18+
class PsrCacheAdapter implements Psr\SimpleCache\CacheInterface
19+
{
20+
public function __construct(
21+
private Nette\Caching\Storage $storage,
22+
) {
23+
}
24+
25+
26+
public function get(string $key, mixed $default = null): mixed
27+
{
28+
return $this->storage->read($key) ?? $default;
29+
}
30+
31+
32+
public function set(string $key, mixed $value, null|int|DateInterval $ttl = null): bool
33+
{
34+
$dependencies = [];
35+
if ($ttl !== null) {
36+
$dependencies[Nette\Caching\Cache::Expire] = self::ttlToSeconds($ttl);
37+
}
38+
39+
$this->storage->write($key, $value, $dependencies);
40+
41+
return true;
42+
}
43+
44+
45+
public function delete(string $key): bool
46+
{
47+
$this->storage->remove($key);
48+
49+
return true;
50+
}
51+
52+
53+
public function clear(): bool
54+
{
55+
$this->storage->clean([Nette\Caching\Cache::All => true]);
56+
57+
return true;
58+
}
59+
60+
61+
/**
62+
* @return Generator<string, mixed>
63+
*/
64+
public function getMultiple(iterable $keys, mixed $default = null): iterable
65+
{
66+
foreach ($keys as $name) {
67+
yield $name => $this->get($name, $default);
68+
}
69+
}
70+
71+
72+
/**
73+
* @param iterable<string|int, mixed> $values
74+
*/
75+
public function setMultiple(iterable $values, null|int|DateInterval $ttl = null): bool
76+
{
77+
$ttl = self::ttlToSeconds($ttl);
78+
79+
foreach ($values as $key => $value) {
80+
$this->set((string) $key, $value, $ttl);
81+
}
82+
83+
return true;
84+
}
85+
86+
87+
public function deleteMultiple(iterable $keys): bool
88+
{
89+
foreach ($keys as $value) {
90+
$this->delete($value);
91+
}
92+
93+
return true;
94+
}
95+
96+
97+
public function has(string $key): bool
98+
{
99+
return $this->storage->read($key) !== null;
100+
}
101+
102+
103+
private static function ttlToSeconds(null|int|DateInterval $ttl = null): ?int
104+
{
105+
if ($ttl instanceof DateInterval) {
106+
return self::dateIntervalToSeconds($ttl);
107+
}
108+
109+
return $ttl;
110+
}
111+
112+
113+
private static function dateIntervalToSeconds(DateInterval $dateInterval): int
114+
{
115+
$now = new DateTimeImmutable();
116+
$expiresAt = $now->add($dateInterval);
117+
118+
return $expiresAt->getTimestamp() - $now->getTimestamp();
119+
}
120+
}
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\PsrCacheAdapter;
6+
use Nette\Caching\Storages\DevNullStorage;
7+
use Tester\Assert;
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
11+
test('get', function () {
12+
$cache = new PsrCacheAdapter(new DevNullStorage());
13+
Assert::null($cache->get('test'));
14+
});
15+
16+
test('get with default', function () {
17+
$cache = new PsrCacheAdapter(new DevNullStorage());
18+
Assert::true($cache->get('test', true));
19+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\PsrCacheAdapter;
6+
use Nette\Caching\Storages\DevNullStorage;
7+
use Tester\Assert;
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
11+
test('get multiple', function () {
12+
$cache = new PsrCacheAdapter(new DevNullStorage());
13+
$x = iterator_to_array($cache->getMultiple(['test', 'test1']));
14+
15+
Assert::same([
16+
'test' => null,
17+
'test1' => null,
18+
], $x);
19+
});
20+
21+
test('get multiple with default', function () {
22+
$cache = new PsrCacheAdapter(new DevNullStorage());
23+
$x = iterator_to_array($cache->getMultiple(['test', 'test1'], true));
24+
25+
Assert::same([
26+
'test' => true,
27+
'test1' => true,
28+
], $x);
29+
});
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\PsrCacheAdapter;
6+
use Tester\Assert;
7+
8+
require __DIR__ . '/../bootstrap.php';
9+
require __DIR__ . '/../Caching/Cache.php';
10+
11+
test('has', function () {
12+
$storage = new TestStorage();
13+
$cache = new PsrCacheAdapter($storage);
14+
$cache->set('test1', '1');
15+
16+
Assert::true($cache->has('test1'));
17+
Assert::false($cache->has('test2'));
18+
});
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\PsrCacheAdapter;
6+
use Nette\Caching;
7+
use Tester\Assert;
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
require __DIR__ . '/../Caching/Cache.php';
11+
12+
test('set ttl unlimited', function () {
13+
$storage = new TestStorage();
14+
$cache = new PsrCacheAdapter($storage);
15+
$cache->set('test', '1');
16+
Assert::same([
17+
'data' => '1',
18+
'dependencies' => [],
19+
], $storage->read('test'));
20+
});
21+
22+
test('set ttl int', function () {
23+
$storage = new TestStorage();
24+
$cache = new PsrCacheAdapter($storage);
25+
26+
$cache->set('test', '2', 1);
27+
Assert::same([
28+
'data' => '2',
29+
'dependencies' => [
30+
Caching\Cache::Expire => 1,
31+
],
32+
], $storage->read('test'));
33+
});
34+
35+
test('set ttl DateInterval', function () {
36+
$storage = new TestStorage();
37+
$cache = new PsrCacheAdapter($storage);
38+
39+
$cache->set('test', '3', new DateInterval('P3Y6M4DT12H30M5S'));
40+
Assert::same([
41+
'data' => '3',
42+
'dependencies' => [
43+
Caching\Cache::Expire => 110_899_805,
44+
],
45+
], $storage->read('test'));
46+
47+
$cache->set('test', '4', (new DateTime('1978-01-23 05:06:07'))->diff(new DateTime('1986-12-30 07:08:09')));
48+
Assert::same([
49+
'data' => '4',
50+
'dependencies' => [
51+
Caching\Cache::Expire => 282_016_922,
52+
],
53+
], $storage->read('test'));
54+
55+
$cache->set('test', '5', (new DateTime('1986-12-30 07:08:09'))->diff(new DateTime('1978-01-23 05:06:07')));
56+
Assert::same([
57+
'data' => '5',
58+
'dependencies' => [
59+
Caching\Cache::Expire => -282_016_922,
60+
],
61+
], $storage->read('test'));
62+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\PsrCacheAdapter;
6+
use Nette\Caching;
7+
use Tester\Assert;
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
require __DIR__ . '/../Caching/Cache.php';
11+
12+
test('set multiple ttl unlimited', function () {
13+
$storage = new TestStorage();
14+
$cache = new PsrCacheAdapter($storage);
15+
16+
$cache->setMultiple(['test1' => '1', 'test2' => '2']);
17+
18+
Assert::same([
19+
'data' => '1',
20+
'dependencies' => [],
21+
], $storage->read('test1'));
22+
Assert::same([
23+
'data' => '2',
24+
'dependencies' => [],
25+
], $storage->read('test2'));
26+
});
27+
28+
test('set multiple ttl int', function () {
29+
$storage = new TestStorage();
30+
$cache = new PsrCacheAdapter($storage);
31+
32+
$cache->setMultiple(['test1' => '1', 'test2' => '2'], 1);
33+
34+
Assert::same([
35+
'data' => '1',
36+
'dependencies' => [
37+
Caching\Cache::Expire => 1,
38+
],
39+
], $storage->read('test1'));
40+
41+
Assert::same([
42+
'data' => '2',
43+
'dependencies' => [
44+
Caching\Cache::Expire => 1,
45+
],
46+
], $storage->read('test2'));
47+
});
48+
49+
test('set multiple ttl DateInterval', function () {
50+
$storage = new TestStorage();
51+
$cache = new PsrCacheAdapter($storage);
52+
53+
$cache->setMultiple(['test1' => '1', 'test2' => '2'], new DateInterval('P3Y6M4DT12H30M5S'));
54+
Assert::same([
55+
'data' => '1',
56+
'dependencies' => [
57+
Caching\Cache::Expire => 110_899_805,
58+
],
59+
], $storage->read('test1'));
60+
61+
Assert::same([
62+
'data' => '2',
63+
'dependencies' => [
64+
Caching\Cache::Expire => 110_899_805,
65+
],
66+
], $storage->read('test2'));
67+
});

tests/lock

Whitespace-only changes.

0 commit comments

Comments
 (0)