diff options
| -rw-r--r-- | lib/gitlab/cache/request_store_wrap.rb | 60 | ||||
| -rw-r--r-- | spec/lib/gitlab/cache/request_store_wrap_spec.rb | 107 |
2 files changed, 0 insertions, 167 deletions
diff --git a/lib/gitlab/cache/request_store_wrap.rb b/lib/gitlab/cache/request_store_wrap.rb deleted file mode 100644 index 3e0a5f06b53..00000000000 --- a/lib/gitlab/cache/request_store_wrap.rb +++ /dev/null @@ -1,60 +0,0 @@ -module Gitlab - module Cache - # This module provides a simple way to cache values in RequestStore, - # and the cache key would be based on the class name, method name, - # customized instance level values, and arguments. - # - # A simple example: - # - # class UserAccess - # extend Gitlab::Cache::RequestStoreWrap - # - # request_store_wrap_key do - # [user.id, project.id] - # end - # - # request_store_wrap def can_push_to_branch?(ref) - # # ... - # end - # end - # - # This way, the result of `can_push_to_branch?` would be cached in - # `RequestStore.store` based on the cache key. - module RequestStoreWrap - def self.extended(klass) - return if klass < self - - extension = Module.new - klass.const_set(:RequestStoreWrapExtension, extension) - klass.prepend(extension) - end - - def request_store_wrap_key(&block) - if block_given? - @request_store_wrap_key = block - else - @request_store_wrap_key - end - end - - def request_store_wrap(method_name) - const_get(:RequestStoreWrapExtension) - .send(:define_method, method_name) do |*args| - return super(*args) unless RequestStore.active? - - klass = self.class - key = [klass.name, - method_name, - *instance_exec(&klass.request_store_wrap_key), - *args].join(':') - - if RequestStore.store.key?(key) - RequestStore.store[key] - else - RequestStore.store[key] = super(*args) - end - end - end - end - end -end diff --git a/spec/lib/gitlab/cache/request_store_wrap_spec.rb b/spec/lib/gitlab/cache/request_store_wrap_spec.rb deleted file mode 100644 index 87ea26a9635..00000000000 --- a/spec/lib/gitlab/cache/request_store_wrap_spec.rb +++ /dev/null @@ -1,107 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Cache::RequestStoreWrap, :request_store do - class ExpensiveAlgorithm - extend Gitlab::Cache::RequestStoreWrap - - attr_accessor :id, :name, :result - - def initialize(id, name, result) - self.id = id - self.name = name - self.result = result - end - - request_store_wrap_key do - [id, name] - end - - request_store_wrap def compute(arg) - result << arg - end - - request_store_wrap def repute(arg) - result << arg - end - end - - let(:algorithm) { ExpensiveAlgorithm.new('id', 'name', []) } - - context 'when RequestStore is active' do - it 'does not compute twice for the same argument' do - result = algorithm.compute(true) - - expect(result).to eq([true]) - expect(algorithm.compute(true)).to eq(result) - expect(algorithm.result).to eq(result) - end - - it 'computes twice for the different argument' do - algorithm.compute(true) - result = algorithm.compute(false) - - expect(result).to eq([true, false]) - expect(algorithm.result).to eq(result) - end - - it 'computes twice for the different keys, id' do - algorithm.compute(true) - algorithm.id = 'ad' - result = algorithm.compute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - - it 'computes twice for the different keys, name' do - algorithm.compute(true) - algorithm.name = 'same' - result = algorithm.compute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - - it 'computes twice for the different class name' do - algorithm.compute(true) - allow(ExpensiveAlgorithm).to receive(:name).and_return('CheapAlgo') - result = algorithm.compute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - - it 'computes twice for the different method' do - algorithm.compute(true) - result = algorithm.repute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - - it 'computes twice if RequestStore starts over' do - algorithm.compute(true) - RequestStore.end! - RequestStore.clear! - RequestStore.begin! - result = algorithm.compute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - end - - context 'when RequestStore is inactive' do - before do - RequestStore.end! - end - - it 'computes twice even if everything is the same' do - algorithm.compute(true) - result = algorithm.compute(true) - - expect(result).to eq([true, true]) - expect(algorithm.result).to eq(result) - end - end -end |
