From 37563fbd0250089e5395a3d68ff152437609252c Mon Sep 17 00:00:00 2001 From: Rias Date: Fri, 14 Jun 2024 15:11:20 +0200 Subject: [PATCH 1/6] Allow configuring the Stache's Cache Store --- config/stache.php | 11 +++++++++++ src/Facades/Stache.php | 1 + src/Stache/Duplicates.php | 6 +++--- src/Stache/Indexes/Index.php | 8 ++++---- src/Stache/Stache.php | 13 +++++++++---- src/Stache/Stores/BasicStore.php | 7 ++++--- src/Stache/Stores/CollectionEntriesStore.php | 3 ++- src/Stache/Stores/ContainerAssetsStore.php | 3 ++- src/Stache/Stores/Keys.php | 7 ++++--- src/Stache/Stores/Store.php | 18 +++++++++--------- src/Stache/Stores/TaxonomyTermsStore.php | 2 +- 11 files changed, 50 insertions(+), 29 deletions(-) diff --git a/config/stache.php b/config/stache.php index 71044d5ab30..d6c5f76afdc 100644 --- a/config/stache.php +++ b/config/stache.php @@ -17,6 +17,17 @@ 'watcher' => env('STATAMIC_STACHE_WATCHER', true), + /* + |-------------------------------------------------------------------------- + | Cache Store + |-------------------------------------------------------------------------- + | + | Here you may configure which Cache Store the Stache uses. + | + */ + + 'cache_store' => null, + /* |-------------------------------------------------------------------------- | Stores diff --git a/src/Facades/Stache.php b/src/Facades/Stache.php index 6a321cbd1a9..91155313a0b 100644 --- a/src/Facades/Stache.php +++ b/src/Facades/Stache.php @@ -11,6 +11,7 @@ * @method static self registerStores($stores) * @method static mixed stores() * @method static mixed store($key) + * @method static \Illuminate\Contracts\Cache\Store cache() * @method static string generateId() * @method static self clear() * @method static void refresh() diff --git a/src/Stache/Duplicates.php b/src/Stache/Duplicates.php index c22fcdb0629..78622018a1a 100644 --- a/src/Stache/Duplicates.php +++ b/src/Stache/Duplicates.php @@ -49,19 +49,19 @@ public function cache() return; } - Cache::forever('stache::duplicates', $this->items); + $this->stache->cacheStore()->forever('stache::duplicates', $this->items); } public function load() { - $this->items = Cache::get('stache::duplicates', []); + $this->items = $this->stache->cacheStore()->get('stache::duplicates', []); return $this; } public function clear() { - Cache::forget('stache::duplicates'); + $this->stache->cacheStore()->forget('stache::duplicates'); return $this; } diff --git a/src/Stache/Indexes/Index.php b/src/Stache/Indexes/Index.php index 0375a928141..90ed5fa4761 100644 --- a/src/Stache/Indexes/Index.php +++ b/src/Stache/Indexes/Index.php @@ -76,7 +76,7 @@ public function load() debugbar()->addMessage("Loading index: {$this->store->key()}/{$this->name}", 'stache'); - $this->items = Cache::get($this->cacheKey()); + $this->items = Stache::cacheStore()->get($this->cacheKey()); if ($this->items === null) { $this->update(); @@ -106,12 +106,12 @@ public function update() public function isCached() { - return Cache::has($this->cacheKey()); + return Stache::cacheStore()->has($this->cacheKey()); } public function cache() { - Cache::forever($this->cacheKey(), $this->items); + Stache::cacheStore()->forever($this->cacheKey(), $this->items); } public function updateItem($item) @@ -153,7 +153,7 @@ public function clear() $this->loaded = false; $this->items = null; - Cache::forget($this->cacheKey()); + Stache::cacheStore()->forget($this->cacheKey()); } public static function currentlyLoading() diff --git a/src/Stache/Stache.php b/src/Stache/Stache.php index 29e164c8172..7fe0b9a9394 100644 --- a/src/Stache/Stache.php +++ b/src/Stache/Stache.php @@ -63,6 +63,11 @@ public function stores() return $this->stores; } + public function cacheStore() + { + return Cache::store(config('stache.cache_store')); + } + public function store($key) { if (Str::contains($key, '::')) { @@ -85,7 +90,7 @@ public function clear() $this->duplicates()->clear(); - Cache::forget('stache::timing'); + $this->cacheStore()->forget('stache::timing'); return $this; } @@ -146,7 +151,7 @@ public function stopTimer() return $this; } - Cache::forever('stache::timing', [ + $this->cacheStore()->forever('stache::timing', [ 'time' => floor((microtime(true) - $this->startTime) * 1000), 'date' => Carbon::now()->timestamp, ]); @@ -156,12 +161,12 @@ public function stopTimer() public function buildTime() { - return Cache::get('stache::timing')['time'] ?? null; + return $this->cacheStore()->get('stache::timing')['time'] ?? null; } public function buildDate() { - if (! $cache = Cache::get('stache::timing')) { + if (! $cache = $this->cacheStore()->get('stache::timing')) { return null; } diff --git a/src/Stache/Stores/BasicStore.php b/src/Stache/Stores/BasicStore.php index 96c9926b069..ad133af9474 100644 --- a/src/Stache/Stores/BasicStore.php +++ b/src/Stache/Stores/BasicStore.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Cache; use Statamic\Facades\File; +use Statamic\Facades\Stache; use Symfony\Component\Finder\SplFileInfo; abstract class BasicStore extends Store @@ -77,7 +78,7 @@ protected function getCachedItem($key) { $cacheKey = $this->getItemCacheKey($key); - return Cache::get($cacheKey); + return Stache::cacheStore()->get($cacheKey); } protected function cacheItem($item) @@ -86,12 +87,12 @@ protected function cacheItem($item) $cacheKey = $this->getItemCacheKey($key); - Cache::forever($cacheKey, $item); + Stache::cacheStore()->forever($cacheKey, $item); } public function forgetItem($key) { - Cache::forget($this->getItemCacheKey($key)); + Stache::cacheStore()->forget($this->getItemCacheKey($key)); } protected function getItemCacheKey($key) diff --git a/src/Stache/Stores/CollectionEntriesStore.php b/src/Stache/Stores/CollectionEntriesStore.php index b045e214c76..29971932026 100644 --- a/src/Stache/Stores/CollectionEntriesStore.php +++ b/src/Stache/Stores/CollectionEntriesStore.php @@ -13,6 +13,7 @@ use Statamic\Facades\File; use Statamic\Facades\Path; use Statamic\Facades\Site; +use Statamic\Facades\Stache; use Statamic\Facades\YAML; use Statamic\Stache\Indexes; use Statamic\Stache\Indexes\Index; @@ -230,7 +231,7 @@ protected function getCachedItem($key) { $cacheKey = $this->getItemCacheKey($key); - if (! $entry = Cache::get($cacheKey)) { + if (! $entry = Stache::cacheStore()->get($cacheKey)) { return null; } diff --git a/src/Stache/Stores/ContainerAssetsStore.php b/src/Stache/Stores/ContainerAssetsStore.php index 4d227ddd4b4..96fec1e463c 100644 --- a/src/Stache/Stores/ContainerAssetsStore.php +++ b/src/Stache/Stores/ContainerAssetsStore.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Cache; use Statamic\Facades\AssetContainer; +use Statamic\Facades\Stache; use Statamic\Statamic; use Statamic\Support\Str; @@ -58,7 +59,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } diff --git a/src/Stache/Stores/Keys.php b/src/Stache/Stores/Keys.php index 9a1cb2ee057..69361036a47 100644 --- a/src/Stache/Stores/Keys.php +++ b/src/Stache/Stores/Keys.php @@ -3,6 +3,7 @@ namespace Statamic\Stache\Stores; use Illuminate\Support\Facades\Cache; +use Statamic\Facades\Stache; use Statamic\Stache\Exceptions\DuplicateKeyException; class Keys @@ -17,19 +18,19 @@ public function __construct(Store $store) public function load() { - $this->keys = Cache::get($this->cacheKey(), []); + $this->keys = Stache::cacheStore()->get($this->cacheKey(), []); return $this; } public function cache() { - Cache::forever($this->cacheKey(), $this->keys); + Stache::cacheStore()->forever($this->cacheKey(), $this->keys); } public function clear() { - Cache::forget($this->cacheKey()); + Stache::cacheStore()->forget($this->cacheKey()); } private function cacheKey() diff --git a/src/Stache/Stores/Store.php b/src/Stache/Stores/Store.php index 6ff33ca0448..1c37811e2bc 100644 --- a/src/Stache/Stores/Store.php +++ b/src/Stache/Stores/Store.php @@ -97,7 +97,7 @@ public function indexUsage() { $key = $this->indexUsageCacheKey(); - return $this->usedIndexes = $this->usedIndexes ?? collect(Cache::get($key, [])); + return $this->usedIndexes = $this->usedIndexes ?? collect(Stache::cacheStore()->get($key, [])); } public function cacheIndexUsage($index) @@ -116,7 +116,7 @@ public function cacheIndexUsage($index) $this->usedIndexes = $indexes; - Cache::put($this->indexUsageCacheKey(), $indexes->all()); + Stache::cacheStore()->put($this->indexUsageCacheKey(), $indexes->all()); } protected function indexUsageCacheKey() @@ -180,14 +180,14 @@ public function handleFileChanges() // Get the existing files and timestamps from the cache. $cacheKey = "stache::timestamps::{$this->key()}"; - $existing = collect(Cache::get($cacheKey, [])); + $existing = collect(Stache::cacheStore()->get($cacheKey, [])); // Get the files and timestamps from the filesystem right now. $files = Traverser::filter([$this, 'getItemFilter'])->traverse($this); // Cache the files and timestamps, ready for comparisons on the next request. // We'll do it now since there are multiple early returns coming up. - Cache::forever($cacheKey, $files->all()); + Stache::cacheStore()->forever($cacheKey, $files->all()); // If there are no existing file timestamps in the cache, there's nothing to update. if ($existing->isEmpty()) { @@ -291,7 +291,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } @@ -351,7 +351,7 @@ protected function setPath($key, $path) protected function cachePaths($paths) { - Cache::forever($this->pathsCacheKey(), $paths->all()); + Stache::cacheStore()->forever($this->pathsCacheKey(), $paths->all()); $this->paths = $paths; @@ -361,7 +361,7 @@ protected function cachePaths($paths) public function clearCachedPaths() { $this->paths = null; - Cache::forget($this->pathsCacheKey()); + Stache::cacheStore()->forget($this->pathsCacheKey()); } protected function pathsCacheKey() @@ -381,13 +381,13 @@ public function clear() }); $this->usedIndexes = collect(); - Cache::forget($this->indexUsageCacheKey()); + Stache::cacheStore()->forget($this->indexUsageCacheKey()); $this->clearCachedPaths(); $this->keys()->clear(); - Cache::forget("stache::timestamps::{$this->key()}"); + Stache::cacheStore()->forget("stache::timestamps::{$this->key()}"); } public function warm() diff --git a/src/Stache/Stores/TaxonomyTermsStore.php b/src/Stache/Stores/TaxonomyTermsStore.php index 0c3fd5018ab..bc8ac5b15c1 100644 --- a/src/Stache/Stores/TaxonomyTermsStore.php +++ b/src/Stache/Stores/TaxonomyTermsStore.php @@ -151,7 +151,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } From 7f266c95ef88dd301158d9712e083820744391e1 Mon Sep 17 00:00:00 2001 From: Rias Date: Fri, 14 Jun 2024 15:16:35 +0200 Subject: [PATCH 2/6] Add a custom store test --- tests/Stache/Stores/KeysTest.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/Stache/Stores/KeysTest.php b/tests/Stache/Stores/KeysTest.php index d9434cde7d3..828c203cf4b 100644 --- a/tests/Stache/Stores/KeysTest.php +++ b/tests/Stache/Stores/KeysTest.php @@ -67,6 +67,28 @@ public function it_saves_to_the_cache() $this->assertEquals(['foo' => 'bar'], Cache::get('stache::keys/test-store')); } + #[Test] + public function it_can_use_a_different_cache_store() + { + config()->set('stache.cache_store', 'stache'); + config()->set('cache.stores.stache', [ + 'driver' => 'array', + ]); + + $store = $this->mock(Store::class); + $store->shouldReceive('key')->andReturn('test-store'); + + $keys = (new Keys($store))->setKeys(['foo' => 'bar']); + + $this->assertNull(Cache::get('stache::keys/test-store')); + $this->assertNull(Cache::store('stache')->get('stache::keys/test-store')); + + $keys->cache(); + + $this->assertNull(Cache::get('stache::keys/test-store')); + $this->assertEquals(['foo' => 'bar'], Cache::store('stache')->get('stache::keys/test-store')); + } + #[Test] public function it_loads_from_cache() { From 61db10577b02af2c2ac903b77f299265efe1d11b Mon Sep 17 00:00:00 2001 From: Rias Date: Fri, 14 Jun 2024 15:22:22 +0200 Subject: [PATCH 3/6] Run Pint --- src/Stache/Duplicates.php | 1 - src/Stache/Indexes/Index.php | 1 - src/Stache/Stores/BasicStore.php | 1 - src/Stache/Stores/CollectionEntriesStore.php | 1 - src/Stache/Stores/ContainerAssetsStore.php | 1 - src/Stache/Stores/Keys.php | 1 - src/Stache/Stores/TaxonomyTermsStore.php | 1 - 7 files changed, 7 deletions(-) diff --git a/src/Stache/Duplicates.php b/src/Stache/Duplicates.php index 78622018a1a..3d950d87b23 100644 --- a/src/Stache/Duplicates.php +++ b/src/Stache/Duplicates.php @@ -2,7 +2,6 @@ namespace Statamic\Stache; -use Illuminate\Support\Facades\Cache; use Statamic\Stache\Stores\AggregateStore; use Statamic\Stache\Stores\Store; diff --git a/src/Stache/Indexes/Index.php b/src/Stache/Indexes/Index.php index 90ed5fa4761..00f41b19dac 100644 --- a/src/Stache/Indexes/Index.php +++ b/src/Stache/Indexes/Index.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Indexes; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\Stache; use Statamic\Statamic; diff --git a/src/Stache/Stores/BasicStore.php b/src/Stache/Stores/BasicStore.php index ad133af9474..b0af2fd90f4 100644 --- a/src/Stache/Stores/BasicStore.php +++ b/src/Stache/Stores/BasicStore.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\File; use Statamic\Facades\Stache; use Symfony\Component\Finder\SplFileInfo; diff --git a/src/Stache/Stores/CollectionEntriesStore.php b/src/Stache/Stores/CollectionEntriesStore.php index 29971932026..a00d70eaaa4 100644 --- a/src/Stache/Stores/CollectionEntriesStore.php +++ b/src/Stache/Stores/CollectionEntriesStore.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Entries\GetDateFromPath; use Statamic\Entries\GetSlugFromPath; use Statamic\Entries\GetSuffixFromPath; diff --git a/src/Stache/Stores/ContainerAssetsStore.php b/src/Stache/Stores/ContainerAssetsStore.php index 96fec1e463c..e6617809235 100644 --- a/src/Stache/Stores/ContainerAssetsStore.php +++ b/src/Stache/Stores/ContainerAssetsStore.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\AssetContainer; use Statamic\Facades\Stache; use Statamic\Statamic; diff --git a/src/Stache/Stores/Keys.php b/src/Stache/Stores/Keys.php index 69361036a47..ce7edfd6ee6 100644 --- a/src/Stache/Stores/Keys.php +++ b/src/Stache/Stores/Keys.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\Stache; use Statamic\Stache\Exceptions\DuplicateKeyException; diff --git a/src/Stache/Stores/TaxonomyTermsStore.php b/src/Stache/Stores/TaxonomyTermsStore.php index bc8ac5b15c1..92c8ebd18b9 100644 --- a/src/Stache/Stores/TaxonomyTermsStore.php +++ b/src/Stache/Stores/TaxonomyTermsStore.php @@ -3,7 +3,6 @@ namespace Statamic\Stache\Stores; use Facades\Statamic\Stache\Traverser; -use Illuminate\Support\Facades\Cache; use Statamic\Entries\GetSlugFromPath; use Statamic\Facades\File; use Statamic\Facades\Stache; From 78c4b859f7e727b300fb3e2345e64c112c2133ea Mon Sep 17 00:00:00 2001 From: Rias Date: Fri, 14 Jun 2024 15:27:28 +0200 Subject: [PATCH 4/6] Fix missed tests --- tests/Stache/DuplicatesTest.php | 9 +++++++-- tests/Stache/Stores/AssetContainersStoreTest.php | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/Stache/DuplicatesTest.php b/tests/Stache/DuplicatesTest.php index 6ecc98c437a..3d367671628 100644 --- a/tests/Stache/DuplicatesTest.php +++ b/tests/Stache/DuplicatesTest.php @@ -111,6 +111,7 @@ public function it_saves_to_the_cache() $stache = $this->mock(Stache::class); $stache->shouldReceive('store')->with('test-store')->andReturn($store); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); $duplicates = new Duplicates($stache); @@ -146,7 +147,9 @@ public function it_loads_from_cache() { Cache::forever('stache::duplicates', ['foo' => 'bar']); - $duplicates = new Duplicates($this->mock(Stache::class)); + $stache = $this->mock(Stache::class); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); + $duplicates = new Duplicates($stache); $return = $duplicates->load(); @@ -159,7 +162,9 @@ public function it_clears_the_cache() { Cache::forever('stache::duplicates', ['foo' => 'bar']); - $duplicates = new Duplicates($this->mock(Stache::class)); + $stache = $this->mock(Stache::class); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); + $duplicates = new Duplicates($stache); $this->assertNotNull(Cache::get('stache::duplicates')); diff --git a/tests/Stache/Stores/AssetContainersStoreTest.php b/tests/Stache/Stores/AssetContainersStoreTest.php index 496c3960557..482d2663dd2 100644 --- a/tests/Stache/Stores/AssetContainersStoreTest.php +++ b/tests/Stache/Stores/AssetContainersStoreTest.php @@ -4,6 +4,7 @@ use Facades\Statamic\Stache\Traverser; use Illuminate\Filesystem\Filesystem; +use Illuminate\Support\Facades\Cache; use PHPUnit\Framework\Attributes\Test; use Statamic\Assets\Asset; use Statamic\Contracts\Assets\AssetContainer; @@ -114,6 +115,7 @@ public function it_saves_to_disk() Facades\Stache::shouldReceive('shouldUpdateIndexes')->andReturnTrue(); Facades\Stache::shouldReceive('duplicates')->andReturn(optional()); Facades\Stache::shouldReceive('store')->with('users')->andReturn((new UsersStore((new Stache)->sites(['en']), app('files')))->directory($this->tempDir)); + Facades\Stache::shouldReceive('cacheStore')->andReturn(Cache::store()); $container = Facades\AssetContainer::make('new') ->title('New Container'); From 78174485183fa088cadc49b50c0d3a7617cd092a Mon Sep 17 00:00:00 2001 From: Rias Date: Sat, 15 Jun 2024 20:40:04 +0200 Subject: [PATCH 5/6] Update Stache.php --- src/Facades/Stache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Facades/Stache.php b/src/Facades/Stache.php index 91155313a0b..97e3880f491 100644 --- a/src/Facades/Stache.php +++ b/src/Facades/Stache.php @@ -11,7 +11,7 @@ * @method static self registerStores($stores) * @method static mixed stores() * @method static mixed store($key) - * @method static \Illuminate\Contracts\Cache\Store cache() + * @method static \Illuminate\Contracts\Cache\Store cacheStore() * @method static string generateId() * @method static self clear() * @method static void refresh() From 4f0c4b438d2c9175c4dfd6a9771908198e94c372 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 24 Jun 2024 15:45:11 -0400 Subject: [PATCH 6/6] fix the config location --- src/Stache/Stache.php | 2 +- tests/Stache/Stores/KeysTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Stache/Stache.php b/src/Stache/Stache.php index 1f414d4f133..6c098ac865b 100644 --- a/src/Stache/Stache.php +++ b/src/Stache/Stache.php @@ -65,7 +65,7 @@ public function stores() public function cacheStore() { - return Cache::store(config('stache.cache_store')); + return Cache::store(config('statamic.stache.cache_store')); } public function store($key) diff --git a/tests/Stache/Stores/KeysTest.php b/tests/Stache/Stores/KeysTest.php index 828c203cf4b..542c68e86ce 100644 --- a/tests/Stache/Stores/KeysTest.php +++ b/tests/Stache/Stores/KeysTest.php @@ -70,7 +70,7 @@ public function it_saves_to_the_cache() #[Test] public function it_can_use_a_different_cache_store() { - config()->set('stache.cache_store', 'stache'); + config()->set('statamic.stache.cache_store', 'stache'); config()->set('cache.stores.stache', [ 'driver' => 'array', ]);