any_cache 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -2
  3. data/.rspec +1 -1
  4. data/.rubocop.yml +18 -0
  5. data/.travis.yml +83 -4
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +4 -2
  8. data/README.md +241 -18
  9. data/Rakefile +6 -4
  10. data/any_cache.gemspec +21 -7
  11. data/bin/console +5 -11
  12. data/bin/rspec +119 -0
  13. data/gemfiles/active_support.gemfile +7 -0
  14. data/gemfiles/active_support_with_redis.gemfile +8 -0
  15. data/gemfiles/dalli.gemfile +7 -0
  16. data/gemfiles/redis.gemfile +7 -0
  17. data/gemfiles/redis_store.gemfile +7 -0
  18. data/lib/any_cache.rb +49 -3
  19. data/lib/any_cache/adapters.rb +40 -0
  20. data/lib/any_cache/adapters/active_support_file_store.rb +26 -0
  21. data/lib/any_cache/adapters/active_support_file_store/decrement.rb +10 -0
  22. data/lib/any_cache/adapters/active_support_file_store/expire.rb +10 -0
  23. data/lib/any_cache/adapters/active_support_file_store/fetching.rb +28 -0
  24. data/lib/any_cache/adapters/active_support_file_store/increment.rb +10 -0
  25. data/lib/any_cache/adapters/active_support_file_store/operation.rb +10 -0
  26. data/lib/any_cache/adapters/active_support_file_store/persist.rb +10 -0
  27. data/lib/any_cache/adapters/active_support_memory_store.rb +26 -0
  28. data/lib/any_cache/adapters/active_support_memory_store/decrement.rb +10 -0
  29. data/lib/any_cache/adapters/active_support_memory_store/expire.rb +10 -0
  30. data/lib/any_cache/adapters/active_support_memory_store/fetching.rb +16 -0
  31. data/lib/any_cache/adapters/active_support_memory_store/increment.rb +10 -0
  32. data/lib/any_cache/adapters/active_support_memory_store/operation.rb +10 -0
  33. data/lib/any_cache/adapters/active_support_memory_store/persist.rb +10 -0
  34. data/lib/any_cache/adapters/active_support_naive_store.rb +150 -0
  35. data/lib/any_cache/adapters/active_support_naive_store/decrement.rb +72 -0
  36. data/lib/any_cache/adapters/active_support_naive_store/expire.rb +25 -0
  37. data/lib/any_cache/adapters/active_support_naive_store/increment.rb +71 -0
  38. data/lib/any_cache/adapters/active_support_naive_store/operation.rb +64 -0
  39. data/lib/any_cache/adapters/active_support_naive_store/persist.rb +22 -0
  40. data/lib/any_cache/adapters/active_support_redis_cache_store.rb +129 -0
  41. data/lib/any_cache/adapters/basic.rb +118 -0
  42. data/lib/any_cache/adapters/dalli.rb +140 -0
  43. data/lib/any_cache/adapters/delegator.rb +36 -0
  44. data/lib/any_cache/adapters/redis.rb +151 -0
  45. data/lib/any_cache/adapters/redis_store.rb +41 -0
  46. data/lib/any_cache/error.rb +11 -0
  47. data/lib/any_cache/version.rb +5 -2
  48. metadata +127 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 143bed36460bc0933747966980cb735113a59b2f3b018d25f0b86ddb2cce17c3
4
- data.tar.gz: 05afa376e37f2e504cd87aa296048b67085ccd4a58157cebd52a9665421473a1
3
+ metadata.gz: 8b5cb4e91050841afb6fb75ae7cdf793a209291e28521a07467c3172ca6327b7
4
+ data.tar.gz: 127050e1c3e23797c9ea49c418818ecb54dc34c2c882cf3a20ea095bfe5a852b
5
5
  SHA512:
6
- metadata.gz: 6527203702f2cc6de87163dae5ec5262699a117f7fb2bb4544ee41e1f7c261a7c088fa71605962d941235e870987776f99f10690674568df9c1b04bea48b9c53
7
- data.tar.gz: c81ea6185abc84cb2936b3e42211edf97092809a77701e38210b538548b7875f93766c05f91b646a1924d372e2812e1e9914a138a0d215520d44742fd642a9db
6
+ metadata.gz: dac1643ccf2b3ade6a75c5c7f55c37b69bd41ac8b057c43cb581a58bd2eb3f82e0e5d66562a66f8545a4ec1289f004f5bb3bc589861f6b9c980b297dc41bc58c
7
+ data.tar.gz: 83ec5094b541f79268691ea95e8daeaa01a6d296fbe7e1728289cf7e96ba03536787a3af137350a88194f7264067ffb2a6457611a22bccdf3ef26731e7a46c44
data/.gitignore CHANGED
@@ -1,11 +1,15 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
+ /Gemfile.lock
3
4
  /_yardoc/
4
5
  /coverage/
5
6
  /doc/
6
7
  /pkg/
7
8
  /spec/reports/
8
9
  /tmp/
9
-
10
- # rspec failure tracking
10
+ .rspec_status
11
+ .ruby-version
12
+ gemfiles/*.lock
13
+ *.gem
14
+ /spec/support/artifacts/*
11
15
  .rspec_status
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
3
3
  --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ inherit_gem:
2
+ armitage-rubocop:
3
+ - lib/rubocop.general.yml
4
+ - lib/rubocop.rspec.yml
5
+
6
+ AllCops:
7
+ UseCache: true
8
+ TargetRubyVersion: 2.5.1
9
+ Include:
10
+ - bin/console
11
+ - lib/**/*.rb
12
+ - spec/**/*.rb
13
+ - Gemfile
14
+ - Rakefile
15
+ - any_cache.gemspec
16
+
17
+ Layout/MultilineOperationIndentation:
18
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,5 +1,84 @@
1
- sudo: false
2
1
  language: ruby
3
- rvm:
4
- - 2.5.1
5
- before_install: gem install bundler -v 1.16.2
2
+ sudo: false
3
+ before_install: gem install bundler
4
+ cache: bundler
5
+ script:
6
+ - bundle exec rspec
7
+ services:
8
+ - redis-server
9
+ - memcached
10
+ matrix:
11
+ fast_finish: true
12
+ include:
13
+ - rvm: 2.3.7
14
+ gemfile: gemfiles/active_support.gemfile
15
+ env: TEST_AS_MEMORY_STORE_CACHE=true
16
+ - rvm: 2.4.4
17
+ gemfile: gemfiles/active_support.gemfile
18
+ env: TEST_AS_MEMORY_STORE_CACHE=true
19
+ - rvm: 2.5.1
20
+ gemfile: gemfiles/active_support.gemfile
21
+ env: TEST_AS_MEMORY_STORE_CACHE=true
22
+ - rvm: ruby-head
23
+ gemfile: gemfiles/active_support.gemfile
24
+ env: TEST_AS_MEMORY_STORE_CACHE=true
25
+ - rvm: 2.3.7
26
+ gemfile: gemfiles/active_support.gemfile
27
+ env: TEST_AS_FILE_STORE_CACHE=true
28
+ - rvm: 2.4.4
29
+ gemfile: gemfiles/active_support.gemfile
30
+ env: TEST_AS_FILE_STORE_CACHE=true
31
+ - rvm: 2.5.1
32
+ gemfile: gemfiles/active_support.gemfile
33
+ env: TEST_AS_FILE_STORE_CACHE=true
34
+ - rvm: ruby-head
35
+ gemfile: gemfiles/active_support.gemfile
36
+ env: TEST_AS_FILE_STORE_CACHE=true
37
+ - rvm: 2.3.7
38
+ gemfile: gemfiles/active_support_with_redis.gemfile
39
+ env: TEST_AS_REDIS_CACHE_STORE_CACHE=true
40
+ - rvm: 2.4.4
41
+ gemfile: gemfiles/active_support_with_redis.gemfile
42
+ env: TEST_AS_REDIS_CACHE_STORE_CACHE=true
43
+ - rvm: 2.5.1
44
+ gemfile: gemfiles/active_support_with_redis.gemfile
45
+ env: TEST_AS_REDIS_CACHE_STORE_CACHE=true
46
+ - rvm: ruby-head
47
+ gemfile: gemfiles/active_support_with_redis.gemfile
48
+ env: TEST_AS_REDIS_CACHE_STORE_CACHE=true
49
+ - rvm: 2.3.7
50
+ gemfile: gemfiles/dalli.gemfile
51
+ env: TEST_DALLI_CACHE=true
52
+ - rvm: 2.4.4
53
+ gemfile: gemfiles/dalli.gemfile
54
+ env: TEST_DALLI_CACHE=true
55
+ - rvm: 2.5.1
56
+ gemfile: gemfiles/dalli.gemfile
57
+ env: TEST_DALLI_CACHE=true
58
+ - rvm: ruby-head
59
+ gemfile: gemfiles/dalli.gemfile
60
+ env: TEST_DALLI_CACHE=true
61
+ - rvm: 2.3.7
62
+ gemfile: gemfiles/redis_store.gemfile
63
+ env: TEST_REDIS_STORE_CACHE=true
64
+ - rvm: 2.4.4
65
+ gemfile: gemfiles/redis_store.gemfile
66
+ env: TEST_REDIS_STORE_CACHE=true
67
+ - rvm: 2.5.1
68
+ gemfile: gemfiles/redis_store.gemfile
69
+ env: TEST_REDIS_STORE_CACHE=true
70
+ - rvm: ruby-head
71
+ gemfile: gemfiles/redis_store.gemfile
72
+ env: TEST_REDIS_STORE_CACHE=true
73
+ - rvm: 2.3.7
74
+ gemfile: gemfiles/redis_store.gemfile
75
+ env: TEST_REDIS_CACHE=true
76
+ - rvm: 2.4.4
77
+ gemfile: gemfiles/redis_store.gemfile
78
+ env: TEST_REDIS_CACHE=true
79
+ - rvm: 2.5.1
80
+ gemfile: gemfiles/redis_store.gemfile
81
+ env: TEST_REDIS_CACHE=true
82
+ - rvm: ruby-head
83
+ gemfile: gemfiles/redis_store.gemfile
84
+ env: TEST_REDIS_CACHE=true
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [0.1.0] - 2018-08-26
5
+ - Release :)
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in any_cache.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -1,43 +1,266 @@
1
- # AnyCache
1
+ # AnyCache · [![Gem Version](https://badge.fury.io/rb/any_cache.svg)](https://badge.fury.io/rb/any_cache) [![Build Status](https://travis-ci.org/0exp/any_cache.svg?branch=master)](https://travis-ci.org/0exp/any_cache) [![Coverage Status](https://coveralls.io/repos/github/0exp/any_cache/badge.svg)](https://coveralls.io/github/0exp/any_cache)
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/any_cache`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ AnyCache - a simplest cache wrapper that provides a minimalistic generic interface for all well-known cache storages and includes a minimal set of necessary operations:
4
+ `read`, `write`, `delete`, `expire`, `persist`, `clear`, `increment`, `decrement`.
4
5
 
5
- TODO: Delete this and the text above, and describe your gem
6
+ Supported clients:
6
7
 
7
- ## Installation
8
+ - `Redis` ([gem redis](https://github.com/redis/redis-rb)) ([redis storage](https://redis.io/))
9
+ - `Redis::Store` ([gem redis-store](https://github.com/redis-store/redis-store)) ([redis storage](https://redis.io/))
10
+ - `Dalli::Client` ([gem dalli](https://github.com/petergoldstein/dalli)) ([memcached storage](https://memcached.org/))
11
+ - `ActiveSupport::Cache::FileStore` ([gem activesupport](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/file_store.rb)) ([file storage](https://api.rubyonrails.org/classes/ActiveSupport/Cache/FileStore.html))
12
+ - `ActiveSupport::Cache::MemoryStore` ([gem activesupport](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/memory_store.rb)) ([in memory storage](https://api.rubyonrails.org/classes/ActiveSupport/Cache/MemoryStore.html))
13
+ - `ActiveSupport::Cache::RedisCacheStore` ([gem activesupport](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/redis_cache_store.rb)) ([redis cache storage](https://api.rubyonrails.org/classes/ActiveSupport/Cache/RedisCacheStore.html))
14
+
15
+ ---
8
16
 
9
- Add this line to your application's Gemfile:
17
+ ## Installation
10
18
 
11
19
  ```ruby
12
20
  gem 'any_cache'
13
21
  ```
14
22
 
15
- And then execute:
23
+ ```shell
24
+ bundle install
25
+ # --- or ---
26
+ gem install any_cache
27
+ ```
28
+
29
+ ```ruby
30
+ require 'any_cache'
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Usage / Table of Contents
36
+
37
+ - [Creation](#creation)
38
+ - **Operations**
39
+ - [Read](#read)
40
+ - [Write](#write)
41
+ - [Delete](#delete)
42
+ - [Increment](#increment)
43
+ - [Decrement](#decrement)
44
+ - [Expire](#expire)
45
+ - [Persist](#persist)
46
+ - [Clear](#clear)
47
+
48
+ ---
49
+
50
+ ### Creation
51
+
52
+ To instantiate AnyCache instance you have to provide a client.
53
+ Client - an independent driver that works with a corresponding cache storage (external dependency).
54
+ Supported clients:
55
+
56
+ - `Redis`
57
+ - `Redis::Store`
58
+ - `Dalli::Client`
59
+ - `ActiveSupport::Cache::RedisCacheStore`
60
+ - `ActiveSupport::Cache::FileStore`
61
+ - `ActiveSupport::Cache::MemoryStore`
62
+
63
+ `AnyCache` instantiation:
64
+
65
+ ```ruby
66
+ # 1) create client object
67
+ client = Redis.new(...)
68
+ # -- or --
69
+ client = Redis::Store.new(...)
70
+ # -- or --
71
+ client = Dalli::Client.new(...)
72
+ # -- or --
73
+ client = ActiveSupport::Cache::RedisCacheStore.new(...)
74
+ # -- or --
75
+ client = ActiveSupport::Cache::FileStore.new(...)
76
+ # -- or --
77
+ client = ActiveSupport::Cache::MemoryStore.new(...)
78
+
79
+ # 2) build AnyCache instance
80
+ any_cache = AnyCache.build(client) # => <AnyCache:0x00007f990527f268 ...>
81
+ ```
82
+
83
+ If you want to use your own cache client implementation, you should provide an object that responds to:
84
+
85
+ - `#read(key, [**options])` ([doc](#read))
86
+ - `#write(key, value, [**options])` ([doc](#write))
87
+ - `#delete(key, [**options])` ([doc](#delete))
88
+ - `#increment(key, amount, [**options])` ([doc](#increment))
89
+ - `#decrmeent(key, amount, [**options])` ([doc](#decrement))
90
+ - `#expire(key, [**options])` ([doc](#expire))
91
+ - `#persist(key, [**options])` ([doc](#persist))
92
+ - `#clear([**options])` ([doc](#clear))
93
+
94
+ ---
16
95
 
17
- $ bundle
96
+ ### Read
18
97
 
19
- Or install it yourself as:
98
+ - `AnyCache#read(key)` - get entry value from cache storage
20
99
 
21
- $ gem install any_cache
100
+ ```ruby
101
+ # --- entry exists ---
102
+ any_cache.read("data") # => "some_data"
103
+
104
+ # --- entry doesnt exist ---
105
+ any_cache.read("data") # => nil
106
+ ```
107
+
108
+ ---
109
+
110
+ ### Write
111
+
112
+ - `AnyCache#write(key, value, [expires_in:])` - write new entry to cache storage
113
+
114
+ ```ruby
115
+ # --- permanent entry ---
116
+ any_cache.write("data", 123)
117
+
118
+ # --- temporal entry (expires in 60 seconds) ---
119
+ any_cache.write("data", 123, expires_in: 60)
120
+ ```
121
+
122
+ ---
123
+
124
+ ### Delete
125
+
126
+ - `AnyCache#delete(key)` - remove entry from cache storage
127
+
128
+ ```ruby
129
+ any_cache.delete("data")
130
+ ```
131
+
132
+ ---
133
+
134
+ ### Increment
135
+
136
+ - `AnyCache#increment(key, amount = 1, [expires_in:])` - increment entry's value by passed amount
137
+ and set new expiration time if needed
138
+
139
+ ```ruby
140
+ # --- increment existing entry ---
141
+ any_cache.write("data", 1)
22
142
 
23
- ## Usage
143
+ # --- increment by default value (1) ---
144
+ any_cache.increment("data") # => 2
145
+
146
+ # --- increment by custom value ---
147
+ any_cache.increment("data", 12) # => 14
148
+
149
+ # --- increment and expire after 31 seconds
150
+ any_cache.incrmeent("data", expires_in: 31) # => 15
151
+
152
+ # --- increment nonexistent entry (create new entry) ---
153
+ any_cache.increment("another_data", 5, expires_in: 5) # => 5
154
+ ```
155
+
156
+ ---
157
+
158
+ ### Decrement
159
+
160
+ - `AnyCache#decrement(key, amount = 1, [expires_in:])` - decrement entry's value by passed amount
161
+ and set new expiration time if needed
162
+
163
+ ```ruby
164
+ # --- decrement existing entry ---
165
+ any_cache.write("data", 15)
166
+
167
+ # --- decrement by default value (1) ---
168
+ any_cache.decrement("data") # => 14
169
+
170
+ # --- decrement by custom value ---
171
+ any_cache.decrement("data", 10) # => 4
172
+
173
+ # --- decrement and expire after 5 seconds
174
+ any_cache.decrememnt("data", expirs_in: 5) # => 3
175
+
176
+ # --- decrement nonexistent entry (create new entry) ---
177
+ any_cache.decrememnt("another_data", 2, expires_in: 10) # => -2 (or 0 for Dalli::Client)
178
+ ```
179
+
180
+ ---
181
+
182
+ ### Expire
183
+
184
+ - `AnyCache#expire(key, [expires_in:])` - expire entry immediately or set the new expiration time
185
+
186
+ ```ruby
187
+ # --- expire immediately ---
188
+ any_cache.expire("data")
189
+
190
+ # --- set new expiration time (in seconds) --
191
+ any_cache.expire("data", expires_in: 36)
192
+ ```
193
+
194
+ ---
195
+
196
+ ### Persist
197
+
198
+ - `AnyCache#persist(key)` - change entry's expiration time to permanent
199
+
200
+ ```ruby
201
+ # --- create temporal entry (30 seconds) ---
202
+ any_cache.write("data", { a: 1 }, expires_in: 30)
203
+
204
+ # --- remove entry expiration (make it permanent) ---
205
+ any_cache.persist("data")
206
+ ```
207
+
208
+ ---
209
+
210
+ ### Clear
211
+
212
+ - `AnyCache#clear()` - clear cache database
213
+
214
+ ```ruby
215
+ # --- prepare cache data ---
216
+ any_cache.write("data", { a: 1, b: 2 })
217
+ any_cache.write("another_data", 123_456)
218
+
219
+ any_cache.read("data") # => { a: 1, b: 2 }
220
+ any_cache.read("another_data") # => 123_456
221
+
222
+ # --- clear cache ---
223
+ any_cache.clear
224
+
225
+ any_cache.read("data") # => nil
226
+ any_cache.read("another_data") # => nil
227
+ ```
228
+
229
+ ---
230
+
231
+ ## Build
232
+
233
+ - see [bin/rspec](bin/rspec)
234
+
235
+ ```shell
236
+ bin/rspec --test-redis # run specs with Redis
237
+ bin/rspec --test-redis-store # run specs with Redis::Store
238
+ bin/rspec --test-dalli # run specs with Dalli::Client
239
+ bin/rspec --test-as-file-store # run specs with ActiveSupport::Cache::FileStore
240
+ bin/rspec --test-as-memory-store # run specs with ActiveSupport::Cache::MemoryStore
241
+ bin/rspec --test-as-redis-cache-store # run specs with ActiveSupport::Cache::RedisCacheStore
242
+ ```
24
243
 
25
- TODO: Write usage instructions here
244
+ ---
26
245
 
27
- ## Development
246
+ ## Roadmap
28
247
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
248
+ - configuration layer with ability to instantiate cache clients implicitly
30
249
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
250
+ ---
32
251
 
33
252
  ## Contributing
34
253
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/any_cache. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
254
+ - Fork it (https://github.com/0exp/any_cache/fork)
255
+ - Create your feature branch (`git checkout -b feature/my-new-feature`)
256
+ - Commit your changes (`git commit -am 'Add some feature'`)
257
+ - Push to the branch (`git push origin feature/my-new-feature`)
258
+ - Create new Pull Request
36
259
 
37
260
  ## License
38
261
 
39
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
262
+ Released under MIT License.
40
263
 
41
- ## Code of Conduct
264
+ ## Authors
42
265
 
43
- Everyone interacting in the AnyCache project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/any_cache/blob/master/CODE_OF_CONDUCT.md).
266
+ Created by [Rustam Ibragimov](https://github.com/0exp/)