Skip to content

Commit

Permalink
Merge pull request #6 from 0exp/feature/cache
Browse files Browse the repository at this point in the history
[utilities/cache] Cache utlitiy
  • Loading branch information
0exp committed Aug 19, 2018
2 parents 8fb76db + 92bfd14 commit f089ba5
Show file tree
Hide file tree
Showing 61 changed files with 2,133 additions and 26 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
.ruby-version
gemfiles/*.lock
*.gem
/spec/support/artifacts/*
TODOS.md
3 changes: 3 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ AllCops:
- Gemfile
- Rakefile
- blast_wave.gemspec

Layout/MultilineOperationIndentation:
Enabled: false
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ matrix:
- rvm: ruby-head
- rvm: jruby-head
script:
- bundle exec rubocop
- bundle exec rspec
- bundle exec rake rubocop
- bundle exec rake rspec
notifications:
slack:
secure: Q+ekBKUsaRXWKg1nEDdfFT7o8ol22IKhVEAmcQgQeL9s2qDafs/0FZvsPj/UYjNIeX7zqRe1jTQv/P+9rbDzOLtZSG3z5PG2iWrPpOdBzPeoxdTboqsFbC57gsCB6YjZwV6tw7xDC3AudJUZQjEtoZkhhf5R3D8aK+x/ujuaT2xG5sR1ZGcH2vIjP47GLdaLfyBMlg2FYxG3UlWOsb7nCSdwVi1Ez1GW7cWAYaE9lYRCiy/vL8rOzDwbDXEOdDGjTnKqW76c95c983tEBCA3NJt3P3n/azCapnANgdHROcAxy0/9JwJ2iFvaRm+7Fm8EtQvsvzOAf5GdUi5xQ9RrdVUzh8SeUh9o5U14XNOjPy1QgA0IlXJSLJrDbdTgnSBa35EWxkLv35PDboAzbAbSrMG3Xsk8vxzZLLoMP8EKqWXjjX7WxUTPCyGL0Pxrp3ZMIqhoPcI4qsDUQo3rQSp8ITO3rqGQYLsuRlN3lEKz697D6I6y6sd2drmKUe30N/A5vauf8JDUPs/4IDwzG5+qlN+E2O9pZQR+oSeKB70pjb2yIOyVlRbP3mJuHdnvwjwJzwBN/d8TZr4v0rXOGSyZq4eTah75xlzKpQcq1fZltco2vDM9gQHyj7iT6i/puXtfjCPheFGIM0N7/4j0dukYliUD8qmgTZWsoeuh1mC2PCQ=
12 changes: 10 additions & 2 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@

require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
require 'rubocop'
require 'rubocop-rspec'
require 'rubocop/rake_task'

RSpec::Core::RakeTask.new(:spec)
RuboCop::RakeTask.new(:rubocop) do |t|
t.options = %w[--config ./.rubocop.yml]
t.requires << 'rubocop-rspec'
end

task default: :spec
RSpec::Core::RakeTask.new(:rspec)

task default: :rspec
2 changes: 1 addition & 1 deletion bin/console
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@

require 'bundler/setup'
require 'blast_wave'

require 'pry'

Pry.start
119 changes: 119 additions & 0 deletions bin/rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'pathname'
require 'optparse'

module BlastWaveSpecRunner
extend self

def expand_gemfile_path(gemfile_name)
File.expand_path(
File.join('..', '..', 'gemfiles', gemfile_name),
Pathname.new(__FILE__).realpath
)
end

GEMFILES = {
redis: expand_gemfile_path('redis.gemfile'),
redis_store: expand_gemfile_path('redis_store.gemfile'),
dalli: expand_gemfile_path('dalli.gemfile'),
active_support_with_redis: expand_gemfile_path('active_support_with_redis.gemfile'),
active_support: expand_gemfile_path('active_support.gemfile')
}.freeze

# rubocop:disable Metrics/MethodLength, Metrics/BlockLength
def run!
OptionParser.new do |opts|
opts.banner = 'Usage: bin/rspec [options]'

opts.on(
'--test-redis-cache',
'Run Redis cache specs'
) { run_redis_cache_specs! }

opts.on(
'--test-redis-store-cache',
'Run Redis::Store cache specs'
) { run_redis_store_cache_specs! }

opts.on(
'--test-dalli-cache',
'Run Dalli cache specs'
) { run_dalli_cache_specs! }

opts.on(
'--test-as-redis-cache-store-cache',
'Run ActiveSupport::Cache::RedisCacheStore cache specs'
) { run_as_redis_cache_store_cache_specs! }

opts.on(
'--test-as-file-store-cache',
'Run ActiveSupport::Cache::FileStore cache specs'
) { run_as_file_store_cache_specs! }

opts.on(
'--test-as-memory-store-cache',
'Run ActiveSupport::Cache::MemoryStore cache specs'
) { run_as_memory_store_cache_specs! }

opts.on(
'-h', '--help',
'Show this message'
) { puts opts }
end.parse!
end
# rubocop:enable Metrics/MethodLength, Metrics/BlockLength

private

def run_redis_cache_specs!
ENV['TEST_REDIS_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:redis]

run_tests!
end

def run_redis_store_cache_specs!
ENV['TEST_REDIS_STORE_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:redis_store]

run_tests!
end

def run_dalli_cache_specs!
ENV['TEST_DALLI_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:dalli]

run_tests!
end

def run_as_redis_cache_store_cache_specs!
ENV['TEST_AS_REDIS_CACHE_STORE_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:active_support_with_redis]

run_tests!
end

def run_as_file_store_cache_specs!
ENV['TEST_AS_FILE_STORE_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:active_support]

run_tests!
end

def run_as_memory_store_cache_specs!
ENV['TEST_AS_MEMORY_STORE_CACHE'] = 'true'
ENV['BUNDLE_GEMFILE'] = GEMFILES[:active_support]

run_tests!
end

def run_tests!
require 'rubygems'
require 'bundler/setup'
load Gem.bin_path('rspec-core', 'rspec')
end
end

BlastWaveSpecRunner.run!
2 changes: 1 addition & 1 deletion blast_wave.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Gem::Specification.new do |spec|

spec.add_development_dependency 'coveralls', '~> 0.8'
spec.add_development_dependency 'simplecov', '~> 0.16'
spec.add_development_dependency 'armitage-rubocop', '~> 0.5'
spec.add_development_dependency 'armitage-rubocop', '~> 0.6'
spec.add_development_dependency 'rspec', '~> 3.8'
spec.add_development_dependency 'rack-test', '~> 1.1'

Expand Down
7 changes: 7 additions & 0 deletions gemfiles/active_support.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'activesupport', '~> 5.2'

gemspec path: '..'
8 changes: 8 additions & 0 deletions gemfiles/active_support_with_redis.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'redis', '~> 4.0'
gem 'activesupport', '~> 5.2'

gemspec path: '..'
7 changes: 7 additions & 0 deletions gemfiles/dalli.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'dalli', '~> 2.7'

gemspec path: '..'
7 changes: 7 additions & 0 deletions gemfiles/redis.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'redis', '~> 4.0'

gemspec path: '..'
7 changes: 7 additions & 0 deletions gemfiles/redis_store.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

source 'https://rubygems.org'

gem 'redis-store', '~> 1.5'

gemspec path: '..'
3 changes: 3 additions & 0 deletions lib/blast_wave.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
require 'qonfig'
require 'ipaddr'
require 'concurrent/map'
require 'concurrent/atomic/reentrant_read_write_lock'

module Rack
# @api public
# @since 0.0.0
module BlastWave
require_relative 'blast_wave/version'
require_relative 'blast_wave/error'
require_relative 'blast_wave/utilities'
require_relative 'blast_wave/middleware'
require_relative 'blast_wave/request_id'
require_relative 'blast_wave/check_list'
Expand Down
11 changes: 11 additions & 0 deletions lib/blast_wave/error.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module Rack::BlastWave
# @since 0.1.0
Error = Class.new(StandardError)

# @since 0.1.0
CacheUtilityError = Class.new(Error)
# @since 0.1.0
UnsupportedCacheDriverError = Class.new(CacheUtilityError)
end
9 changes: 9 additions & 0 deletions lib/blast_wave/utilities.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module Rack
# @api private
# @since 0.1.0
module BlastWave::Utilities
require_relative 'utilities/cache'
end
end
43 changes: 43 additions & 0 deletions lib/blast_wave/utilities/cache.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# frozen_string_literal: true

module Rack
# @api private
# @since 0.1.0
class BlastWave::Utilities::Cache
require_relative 'cache/adapters'

# @since 0.1.0
extend Forwardable

class << self
# @param driver [Object]
# @return [BlastWave::Utilities::Cache]
#
# @api private
# @since 0.1.0
def build(driver)
new(Adapters.build(driver))
end
end

# @since 0.1.0
def_delegators :adapter, :read, :write, :delete, :increment, :decrement, :re_expire, :clear

# @param adapter [BlastWave::Utilities::Cache::Adapters::Basic]
# @return [void]
#
# @api private
# @since 0.1.0
def initialize(adapter)
@adapter = adapter
end

private

# @return [BlastWave::Utilities::Cache::Adapters::Basic]
#
# @api private
# @since 0.1.0
attr_reader :adapter
end
end
42 changes: 42 additions & 0 deletions lib/blast_wave/utilities/cache/adapters.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# frozen_string_literal: true

module Rack
# @api private
# @since 0.1.0
module BlastWave::Utilities::Cache::Adapters
require_relative 'adapters/basic'
require_relative 'adapters/delegator'
require_relative 'adapters/dalli'
require_relative 'adapters/redis'
require_relative 'adapters/redis_store'
require_relative 'adapters/active_support_naive_store'
require_relative 'adapters/active_support_file_store'
require_relative 'adapters/active_support_redis_cache_store'
require_relative 'adapters/active_support_memory_store'

class << self
# @param driver [Object]
# @return [BlastWave::Utilities::Cache::Adapters::Basic]
#
# @raise [BlastWave::UnsupportedCacheDriverError]
#
# @api private
# @since 0.1.0
# rubocop:disable Metrics/LineLength
def build(driver)
case
when RedisStore.supported_driver?(driver) then RedisStore.new(driver)
when Redis.supported_driver?(driver) then Redis.new(driver)
when Dalli.supported_driver?(driver) then Dalli.new(driver)
when ActiveSupportRedisCacheStore.supported_driver?(driver) then ActiveSupportRedisCacheStore.new(driver)
when ActiveSupportMemoryStore.supported_driver?(driver) then ActiveSupportMemoryStore.new(driver)
when ActiveSupportFileStore.supported_driver?(driver) then ActiveSupportFileStore.new(driver)
when Delegator.supported_driver?(driver) then Delegator.new(driver)
else
raise BlastWave::UnsupportedCacheDriverError
end
end
# rubocop:enable Metrics/LineLength
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

module Rack
module BlastWave::Utilities::Cache::Adapters
# @api private
# @since 0.1.0
class ActiveSupportFileStore < ActiveSupportNaiveStore
require_relative 'active_support_file_store/fetching'
require_relative 'active_support_file_store/operation'
require_relative 'active_support_file_store/increment'
require_relative 'active_support_file_store/decrement'
require_relative 'active_support_file_store/re_expire'

class << self
# @param driver [Object]
# @return [Boolean]
#
# @api private
# @since 0.1.0
def supported_driver?(driver)
defined?(::ActiveSupport::Cache::FileStore) &&
driver.is_a?(::ActiveSupport::Cache::FileStore)
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

module Rack
module BlastWave::Utilities::Cache::Adapters
# @api private
# @since 0.1.0
class ActiveSupportFileStore::Decrement < ActiveSupportNaiveStore::Decrement
# @since 0.1.0
include ActiveSupportFileStore::Fetching
end
end
end

0 comments on commit f089ba5

Please sign in to comment.