Skip to content

Commit 41c6349

Browse files
committed
add psr-16 implementation
1 parent a76a5d6 commit 41c6349

File tree

10 files changed

+373
-1
lines changed

10 files changed

+373
-1
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
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/Cache.php

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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 Generator;
14+
use Nette;
15+
use Psr;
16+
17+
class Cache implements Psr\SimpleCache\CacheInterface
18+
{
19+
public function __construct(private Nette\Caching\Storage $storage)
20+
{
21+
}
22+
23+
24+
public function get(string $key, mixed $default = null): mixed
25+
{
26+
return $this->storage->read($key) ?? $default;
27+
}
28+
29+
30+
public function set(string $key, mixed $value, null|int|DateInterval $ttl = null): bool
31+
{
32+
$dependencies = [];
33+
if ($ttl !== null) {
34+
$dependencies[Nette\Caching\Cache::Expire] = self::ttlToSeconds($ttl);
35+
}
36+
37+
$this->storage->write($key, $value, $dependencies);
38+
39+
return true;
40+
}
41+
42+
43+
public function delete(string $key): bool
44+
{
45+
$this->storage->remove($key);
46+
47+
return true;
48+
}
49+
50+
51+
public function clear(): bool
52+
{
53+
$this->storage->clean([Nette\Caching\Cache::All => true]);
54+
55+
return true;
56+
}
57+
58+
59+
/**
60+
* @return Generator<string, mixed>
61+
*/
62+
public function getMultiple(iterable $keys, mixed $default = null): iterable
63+
{
64+
foreach ($keys as $name) {
65+
yield $name => $this->get($name, $default);
66+
}
67+
}
68+
69+
70+
/**
71+
* @param iterable<string|int|float, mixed> $values
72+
*/
73+
public function setMultiple(iterable $values, null|int|DateInterval $ttl = null): bool
74+
{
75+
$ttl = self::ttlToSeconds($ttl);
76+
77+
foreach ($values as $key => $value) {
78+
$this->set((string) $key, $value, $ttl);
79+
}
80+
81+
return true;
82+
}
83+
84+
85+
public function deleteMultiple(iterable $keys): bool
86+
{
87+
foreach ($keys as $value) {
88+
$this->delete($value);
89+
}
90+
91+
return true;
92+
}
93+
94+
95+
public function has(string $key): bool
96+
{
97+
return $this->storage->read($key) !== null;
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+
private static function dateIntervalToSeconds(DateInterval $dateInterval): int
110+
{
111+
if ($dateInterval->days === false) {
112+
$days = $dateInterval->y * Nette\Utils\DateTime::YEAR
113+
+ $dateInterval->m * Nette\Utils\DateTime::MONTH
114+
+ $dateInterval->d * Nette\Utils\DateTime::DAY;
115+
} else {
116+
$days = $dateInterval->days * Nette\Utils\DateTime::DAY;
117+
}
118+
119+
$days += $dateInterval->h * Nette\Utils\DateTime::HOUR
120+
+ $dateInterval->i * Nette\Utils\DateTime::MINUTE
121+
+ $dateInterval->s;
122+
123+
return $dateInterval->invert === 1 ? $days * -1 : $days;
124+
}
125+
126+
}

tests/Bridges.Psr/Cache.delete.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\Cache;
6+
use Tester\Assert;
7+
8+
require __DIR__ . '/../bootstrap.php';
9+
require __DIR__ . '/../Caching/Cache.php';
10+
11+
test('delete', function () {
12+
$storage = new TestStorage();
13+
$cache = new Cache($storage);
14+
$cache->set('test1', '1');
15+
$cache->set('test2', '2');
16+
17+
$cache->delete('test1');
18+
19+
Assert::null($storage->read('test1'));
20+
Assert::same([
21+
'data' => '2',
22+
'dependencies' => [],
23+
], $storage->read('test2'));
24+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Bridges\Psr\Cache;
6+
use Tester\Assert;
7+
8+
require __DIR__ . '/../bootstrap.php';
9+
require __DIR__ . '/../Caching/Cache.php';
10+
11+
test('delete multiple', function () {
12+
$storage = new TestStorage();
13+
$cache = new Cache($storage);
14+
$cache->set('test1', '1');
15+
$cache->set('test2', '2');
16+
17+
$cache->deleteMultiple(['test1', 'test3']);
18+
19+
Assert::null($storage->read('test1'));
20+
Assert::same([
21+
'data' => '2',
22+
'dependencies' => [],
23+
], $storage->read('test2'));
24+
Assert::null($storage->read('test3'));
25+
});

tests/Bridges.Psr/Cache.get.phpt

Lines changed: 19 additions & 0 deletions
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\Cache;
6+
use Nette\Caching\Storages\DevNullStorage;
7+
use Tester\Assert;
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
11+
test('get', function () {
12+
$cache = new Cache(new DevNullStorage());
13+
Assert::null($cache->get('test'));
14+
});
15+
16+
test('get with default', function () {
17+
$cache = new Cache(new DevNullStorage());
18+
Assert::true($cache->get('test', true));
19+
});
Lines changed: 29 additions & 0 deletions
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\Cache;
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 Cache(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 Cache(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+
});

tests/Bridges.Psr/Cache.has.phpt

Lines changed: 18 additions & 0 deletions
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\Cache;
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 Cache($storage);
14+
$cache->set('test1', '1');
15+
16+
Assert::true($cache->has('test1'));
17+
Assert::false($cache->has('test2'));
18+
});

tests/Bridges.Psr/Cache.set.phpt

Lines changed: 62 additions & 0 deletions
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\Cache;
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 Cache($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 Cache($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 Cache($storage);
38+
39+
$cache->set('test', '3', new DateInterval('P3Y6M4DT12H30M5S'));
40+
Assert::same([
41+
'data' => '3',
42+
'dependencies' => [
43+
Caching\Cache::Expire => 110842205
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 => 281930522
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 => -281930522
60+
],
61+
], $storage->read('test'));
62+
});
Lines changed: 67 additions & 0 deletions
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\Cache;
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 Cache($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 Cache($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 Cache($storage);
52+
53+
$cache->setMultiple(['test1' => '1', 'test2' => '2'], new DateInterval('P3Y6M4DT12H30M5S'));
54+
Assert::same([
55+
'data' => '1',
56+
'dependencies' => [
57+
Caching\Cache::Expire => 110842205
58+
],
59+
], $storage->read('test1'));
60+
61+
Assert::same([
62+
'data' => '2',
63+
'dependencies' => [
64+
Caching\Cache::Expire => 110842205
65+
],
66+
], $storage->read('test2'));
67+
});

tests/Caching/Cache.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function lock(string $key): void
3333

3434
public function remove(string $key): void
3535
{
36+
unset($this->data[$key]);
3637
}
3738

3839

0 commit comments

Comments
 (0)