Skip to content

Commit 96ec077

Browse files
h4kunadg
authored andcommitted
added PSR-16 adapter (#77)
1 parent 8483751 commit 96ec077

7 files changed

+304
-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": "^2.11 || ^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.0 <3.0.12"

src/Bridges/Psr/PsrCacheAdapter.php

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

0 commit comments

Comments
 (0)