From b9f902a27158bbc7ae5dc75b8eac57a96d4bad4f Mon Sep 17 00:00:00 2001 From: Matthew Salazar Date: Tue, 12 May 2020 23:13:17 -0400 Subject: [PATCH] Added option for disabling cache --- CHANGELOG.md | 5 +++-- README.md | 29 ++++++++++++++++++++++++++--- cache.go | 5 +++-- client.go | 2 +- client_test.go | 16 +++++++++++++++- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba1fb6c..3a95b59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- Settings for cache (pokeapi.CacheSettings) -- Additional testing and documentation for cache settings +- User settings for caching (pokeapi.CacheSettings) + - CustomExpire: set a custom cache expiration (in minutes) + - UseCache: turn caching on/off ## [1.3.2] / 2020.04.03 ### Added diff --git a/README.md b/README.md index daf1d8a..41934c5 100644 --- a/README.md +++ b/README.md @@ -1000,12 +1000,35 @@ As an alternative to `pokeapi.Resource()`, you can use Search to filter resource ### Caching -Calls are automatically cached to cut down on API traffic to PokeAPI, with subsequent calls returning local data. You can clear *all* existing cache data with `pokeapi.ClearCache()`. +Calls are automatically cached to cut down on API traffic to PokeAPI, with subsequent calls returning local data. -By default, cache lasts five minutes. You can adjust this by setting `pokeapi.CacheSettings.CustomExpire` to another number, in minutes. For example, to use a twenty-minute cache expiration: +#### Clearing Cache ```go +// Clear all existing cache entries. +pokeapi.ClearCache() +``` + +#### Custom Expiration + +Custom cache expiration remains for all calls until changed or unset. + +```go +// Set cache expiration to twenty minutes. pokeapi.CacheSettings.CustomExpire = 20 +// Turn custom expiration back off. +pokeapi.CacheSettings.CustomExpire = 0 ``` -Forced non-cached calls coming soon. +#### Disable Cache + +_Please be considerate of PokeAPI and be sure to always operate within this requested limits._ + +As with custom expiration, this setting remains for all calls until changed or unset. + +```go +// Disable checking for cached data +pokeapi.CacheSettings.UseCache = false +// Re-enable checking for cached data +pokeapi.CacheSettings.UseCache = true +``` diff --git a/cache.go b/cache.go index d63343b..36685eb 100644 --- a/cache.go +++ b/cache.go @@ -3,7 +3,8 @@ package pokeapi import "time" var CacheSettings = Settings{ - NoCache: false, + CustomExpire: 0, + UseCache: true, } var defaultCacheSettings = defaultSettings{ @@ -20,7 +21,7 @@ type defaultSettings struct { // CacheSettings are user settings for cache expiration. type Settings struct { CustomExpire time.Duration - NoCache bool + UseCache bool } // ClearCache clears all cached data. diff --git a/client.go b/client.go index c5bebc1..28dcba0 100644 --- a/client.go +++ b/client.go @@ -19,7 +19,7 @@ func init() { func do(endpoint string, obj interface{}) error { cached, found := c.Get(endpoint) - if found { + if found && CacheSettings.UseCache { return json.Unmarshal(cached.([]byte), &obj) } diff --git a/client_test.go b/client_test.go index db5fc0f..ad4e6af 100644 --- a/client_test.go +++ b/client_test.go @@ -59,11 +59,25 @@ func TestCustomExpiration(t *testing.T) { assert.Equal(t, defaultExpire, expires1.Minute(), "Expect expiration time to match default setting.") + ClearCache() CacheSettings.CustomExpire = 20 customExpire := time.Now().Add(CacheSettings.CustomExpire * time.Minute).Minute() - ClearCache() _ = do(endpoint, &mockResource) _, expires2, _ := c.GetWithExpiration(endpoint) assert.Equal(t, customExpire, expires2.Minute(), "Expect expiration time to match custom setting.") } + +func TestNoCache(t *testing.T) { + ClearCache() + _ = do(endpoint, &mockResource) + _, expires1, found1 := c.GetWithExpiration(endpoint) + assert.Equal(t, true, found1, + "Expect to have cached data after first call.") + + CacheSettings.NoCache = true + _ = do(endpoint, &mockResource) + _, expires2, _ := c.GetWithExpiration(endpoint) + assert.NotEqual(t, expires1, expires2, + "Expect cache expiration not to match first call.") +}