cachengue 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: abdbe3f73ef48939bcd5a527588d3dabdcb9f743
4
- data.tar.gz: 184300301128c201b944546a928fc9192c2ac052
2
+ SHA256:
3
+ metadata.gz: 1d61f4fc468d164194855289a59933c239687ba325f33470816ab45dbf383a50
4
+ data.tar.gz: 68fc8ff64e399aca19acc01fbf20272537a67a86c08722967cf7de2e7f19ba0a
5
5
  SHA512:
6
- metadata.gz: 2a312074235e514cfc7cf6275c2fe87adabd6cb1e545e5920d0337a2ebeb36b3211c6b4deb17b489841e7238750d43ab5aaded5424ba0e68f96c47edc1471991
7
- data.tar.gz: 5d104102cddeca4a0075c0d9ecf8e568ac975f39aee63d879706f39dff34338b53c8038edaab32a2a3ffe1fb64bb268e2e0869e8ce18d9be5fef71afaaf3a150
6
+ metadata.gz: edda0834cac796434c6f0e9df1137323f7cd6c1a5ab7713a5ef8fdb251caa8d04682f132ea22ff06a18058d5ec52a8370b6b5b00afb0cb533f4b112a810af2db
7
+ data.tar.gz: ea1e368ed2bc7897c66ec6cbf9a20e82489750d41aea1ee4b1d3bf4fef1779009ffe080d69589e40ec3fe7b85616d48ec410cd1c0039258c01ad112fa1e25f06
@@ -1,17 +1,12 @@
1
1
  AllCops:
2
2
  Exclude:
3
3
  - bin/*
4
- - config/**/*
5
- - db/*
6
- - db/migrate/*
7
- - lib/tasks/*
8
4
  - test/*
5
+ - cachengue.gemspec
9
6
  - Gemfile
10
7
  - Rakefile
11
- - config.ru
12
- - lib/onfleet/onfleet-ruby/**/*
13
8
 
14
- TargetRubyVersion: 2.4
9
+ TargetRubyVersion: 2.5
15
10
 
16
11
  Layout/IndentHash:
17
12
  EnforcedStyle: consistent
@@ -63,5 +58,3 @@ Style/Documentation:
63
58
 
64
59
  Style/Lambda:
65
60
  Enabled: false
66
-
67
-
@@ -1,18 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cachengue (0.1.0)
4
+ cachengue (0.2.0)
5
+ activesupport (>= 5.1)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
9
- activesupport (5.1.6)
10
+ activesupport (5.2.1)
10
11
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
12
  i18n (>= 0.7, < 2)
12
13
  minitest (~> 5.1)
13
14
  tzinfo (~> 1.1)
14
15
  concurrent-ruby (1.0.5)
15
- i18n (1.0.1)
16
+ i18n (1.1.1)
16
17
  concurrent-ruby (~> 1.0)
17
18
  minitest (5.3.5)
18
19
  rake (10.5.0)
@@ -24,11 +25,10 @@ PLATFORMS
24
25
  ruby
25
26
 
26
27
  DEPENDENCIES
27
- activesupport (~> 5.1.5)
28
28
  bundler (~> 1.16)
29
29
  cachengue!
30
- minitest (~> 5.3.4)
30
+ minitest (~> 5.3)
31
31
  rake (~> 10.0)
32
32
 
33
33
  BUNDLED WITH
34
- 1.16.2
34
+ 1.16.3
data/README.md CHANGED
@@ -21,7 +21,7 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
 
24
- ###Examples:
24
+ ### Examples:
25
25
 
26
26
  In ```models/user.rb```
27
27
  ```ruby
@@ -36,5 +36,6 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency "bundler", "~> 1.16"
37
37
  spec.add_development_dependency "rake", "~> 10.0"
38
38
  spec.add_development_dependency "minitest", "~> 5.3"
39
- spec.add_development_dependency "activesupport", "~> 5.1"
39
+
40
+ spec.add_runtime_dependency "activesupport", ">= 5.1"
40
41
  end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'cachengue/version'
4
- require 'cachengue/proxy'
5
3
  require 'cachengue/caching'
4
+ require 'cachengue/namespace'
5
+ require 'cachengue/proxy'
6
+ require 'cachengue/version'
6
7
 
7
8
  module Cachengue
8
9
  module ActiveRecord
9
10
  extend ActiveSupport::Concern
10
11
 
11
12
  included do
12
- extend Cachengue::Caching
13
- before_save do
14
- self.class.cachengue.cache_clear
15
- end
13
+ extend Cachengue::Namespace
14
+
15
+ before_save { self.class.cachengue_clear }
16
16
  end
17
17
  end
18
18
  end
@@ -2,48 +2,80 @@
2
2
 
3
3
  module Cachengue
4
4
  module Caching
5
- def cachengue(method_name = nil, &block)
6
- return Cachengue::Proxy.new(self) if method_name.blank?
5
+ # Reduce memory use and its faster.
6
+ ALL_KEYS = %w[*].freeze
7
+ NONE_KEYS = [].freeze
7
8
 
8
- fetch(self, method_name, [], &block)
9
+ module_function
10
+
11
+ def format_key(namespace, method_name, args)
12
+ args = args.is_a?(Array) ? args.map(&:as_json) : [args.as_json]
13
+ namespace = key_prefix(namespace)
14
+
15
+ "#{namespace}:#{method_name}:#{args}"
9
16
  end
10
17
 
11
- def module_cachengue(method_name, &block)
12
- singleton_class.instance_eval do
13
- define_method(method_name) do |*args|
14
- Cachengue::Caching.fetch(self, method_name, args, &block)
15
- end
18
+ def key_prefix(namespace = nil)
19
+ if namespace.present?
20
+ "cachengue:#{namespace.to_s.underscore}"
21
+ else
22
+ 'cachengue'
16
23
  end
17
24
  end
18
25
 
19
- module_function
26
+ def key_suffix(strategy)
27
+ strategy == :all ? ALL_KEYS : NONE_KEYS
28
+ end
20
29
 
21
- def key_by(classx, method_name, args)
22
- args = args.map(&:as_json)
30
+ def keys(namespace = nil, strategy = :all)
31
+ return [] if Rails.env.test?
23
32
 
24
- "#{key_prefix(classx)}:#{method_name}:#{args}"
33
+ prefix = key_prefix(namespace)
34
+
35
+ key_suffix(strategy).flat_map do |suffix|
36
+ Rails.cache.data.keys("#{prefix}:#{suffix}")
37
+ end
25
38
  end
26
39
 
27
- def key_prefix(classx)
28
- "cache:#{classx.to_s.underscore}"
40
+ def clear(namespace = nil, strategy = :all)
41
+ keys_to_clear = keys(namespace, strategy)
42
+
43
+ clear_keys(keys_to_clear)
29
44
  end
30
45
 
31
- def keys(classx)
32
- prefix = Cachengue::Caching.key_prefix(classx)
46
+ def clear_by(options)
47
+ key = format_key(
48
+ options.fetch(:namespace),
49
+ options[:key] || options.fetch(:method),
50
+ options.fetch(:args)
51
+ )
33
52
 
34
- Rails.cache.data.keys("#{prefix}:*")
53
+ clear_keys([key])
35
54
  end
36
55
 
37
- def clear(classx)
56
+ def clear_keys(keys_to_clear)
38
57
  return if Rails.env.test?
39
58
 
40
- keys(classx).map { |k| Rails.cache.delete(k) }.size
59
+ keys_to_clear.sum do |k|
60
+ Rails.cache.delete(k)
61
+ end
41
62
  end
42
63
 
43
- def fetch(classx, method_name, args)
44
- key = Cachengue::Caching.key_by(classx, method_name, args)
64
+ def fetch(namespace, method_name, args, options = {})
65
+ key = format_key(
66
+ options[:namespace] || namespace,
67
+ options[:key] || options[:method] || method_name,
68
+ options[:args] || args
69
+ )
70
+
71
+ options = options.without(
72
+ :args,
73
+ :key,
74
+ :method,
75
+ :namespace
76
+ )
45
77
 
46
- new_block = proc do
78
+ Rails.cache.fetch(key, options) do
47
79
  value = yield(*args)
48
80
 
49
81
  if defined?(::ActiveRecord) && value.is_a?(::ActiveRecord::Relation)
@@ -52,8 +84,6 @@ module Cachengue
52
84
  value
53
85
  end
54
86
  end
55
-
56
- Rails.cache.fetch(key, &new_block)
57
87
  end
58
88
  end
59
89
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cachengue
4
+ module Namespace
5
+ def cachengue(options = {})
6
+ if block_given?
7
+ # Proc.new is the block passed as argument.
8
+ Caching.fetch(self, nil, [], options, &Proc.new)
9
+ else
10
+ Proxy.new(self, options)
11
+ end
12
+ end
13
+
14
+ def module_cachengue(method_name, options = {})
15
+ singleton_class.instance_eval do
16
+ define_method(method_name) do |*args|
17
+ Caching.fetch(self, method_name, args, options, &Proc.new)
18
+ end
19
+ end
20
+ end
21
+
22
+ def cachengue_namespace(namespace, strategy: :all)
23
+ __cachengue_namespaces__[namespace.to_sym] = strategy
24
+ end
25
+
26
+ def cachengue_clear_by(options)
27
+ Caching.clear_by(
28
+ options.reverse_merge(namespace: self)
29
+ )
30
+ end
31
+
32
+ def cachengue_clear
33
+ __cachengue_namespaces__.inject({}) do |results, (namespace, strategy)|
34
+ results.merge!(
35
+ namespace => Caching.clear(namespace, strategy)
36
+ )
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def __cachengue_namespaces__
43
+ if class_variable_defined?(:@@cachengue_namespaces)
44
+ class_variable_set(
45
+ :@@cachengue_namespaces,
46
+ class_variable_get(:@@cachengue_namespaces)
47
+ )
48
+ else
49
+ class_variable_set(
50
+ :@@cachengue_namespaces,
51
+ to_s.to_sym => :all
52
+ )
53
+ end
54
+ end
55
+ end
56
+ end
@@ -4,8 +4,9 @@
4
4
 
5
5
  module Cachengue
6
6
  class Proxy
7
- def initialize(classx)
7
+ def initialize(classx, options = {})
8
8
  @classx = classx
9
+ @options = options
9
10
  end
10
11
 
11
12
  def cache_keys
@@ -23,7 +24,7 @@ module Cachengue
23
24
  end
24
25
 
25
26
  def method_missing(method_name, *args)
26
- Cachengue::Caching.fetch(@classx, method_name, args) do
27
+ Cachengue::Caching.fetch(@classx, method_name, args, @options) do
27
28
  @classx.public_send(method_name, *args)
28
29
  end
29
30
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cachengue
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cachengue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - shipnow developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-16 00:00:00.000000000 Z
11
+ date: 2018-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,14 +56,14 @@ dependencies:
56
56
  name: activesupport
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '5.1'
62
- type: :development
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5.1'
69
69
  description: A gem for caching
@@ -84,6 +84,7 @@ files:
84
84
  - cachengue.gemspec
85
85
  - lib/cachengue.rb
86
86
  - lib/cachengue/caching.rb
87
+ - lib/cachengue/namespace.rb
87
88
  - lib/cachengue/proxy.rb
88
89
  - lib/cachengue/version.rb
89
90
  homepage: https://gitlab.com/shipnow/cachengue
@@ -106,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  version: '0'
107
108
  requirements: []
108
109
  rubyforge_project:
109
- rubygems_version: 2.6.13
110
+ rubygems_version: 2.7.6
110
111
  signing_key:
111
112
  specification_version: 4
112
113
  summary: cache gem for ruby on rails