kasket 4.0.1 → 4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2a4548deae3c98ad894dbd54829ca55c5fcd0fa
4
- data.tar.gz: 3f746fed7e8508b8d169974c9e660d35f1be92d2
3
+ metadata.gz: 25efa3724a0e5b5d6b1bf69dba58de2afd6bb000
4
+ data.tar.gz: cb0b2b1b91897768971e7bfcc0299ff30254644a
5
5
  SHA512:
6
- metadata.gz: eb3b6225c51e1f02c72d9fe1af8c093ee5c6ae512ad127beae372e016b5ab08072db0020ad9059e0c1c46cb1362b12a36d78eb07da1af460e2a3e7d6e5bab291
7
- data.tar.gz: d3f7df44370ca505b8c686d9a7d00534c7e6b8dd8e5d08ab30fd64080949486827239084915916d04c428cbeef01235c2189041cb450cd0756506b54bdb341ba
6
+ metadata.gz: 4b2ae0752068653cf1edaa1f17dc8ca7aee2c6d840f564134e743968fc849e72db1da4d56e2b9f626f2782a94a5702873fee87e409828c75fd88c97577ffb1c9
7
+ data.tar.gz: 7e7b93830ad115b0c70fc29d442b1f2479adeee06326a06b7d6c106118af5e92afa717be3b3ab0638bf3bcb86dec1d3647379eb48ee30a4f7e9c5116d14ec34f
data/README.rdoc CHANGED
@@ -94,10 +94,6 @@ We have only used and tested Kasket on MySql.
94
94
 
95
95
  Let us know if you find any.
96
96
 
97
- == Requirements
98
-
99
- * ActiveRecord 2.3.x
100
-
101
97
  == Isn't this what Cache Money does?
102
98
 
103
99
  Absolutely, but cache money does so much more.
data/lib/kasket.rb CHANGED
@@ -9,7 +9,6 @@ module Kasket
9
9
  autoload :DirtyMixin, 'kasket/dirty_mixin'
10
10
  autoload :QueryParser, 'kasket/query_parser'
11
11
  autoload :ConfigurationMixin, 'kasket/configuration_mixin'
12
- autoload :ReloadAssociationMixin, 'kasket/reload_association_mixin'
13
12
  autoload :Query, 'kasket/query'
14
13
  autoload :Visitor, 'kasket/visitor'
15
14
  autoload :SelectManagerMixin, 'kasket/select_manager_mixin'
@@ -30,11 +29,6 @@ module Kasket
30
29
  ActiveRecord::Relation.send(:include, Kasket::RelationMixin)
31
30
  Arel::SelectManager.send(:include, Kasket::SelectManagerMixin)
32
31
  end
33
-
34
- if options[:assoliations_reload_hack]
35
- ActiveRecord::Associations::BelongsToAssociation.send(:include, Kasket::ReloadAssociationMixin)
36
- ActiveRecord::Associations::HasOneThroughAssociation.send(:include, Kasket::ReloadAssociationMixin)
37
- end
38
32
  end
39
33
 
40
34
  def self.cache_store=(options)
@@ -44,10 +38,4 @@ module Kasket
44
38
  def self.cache
45
39
  @cache_store ||= Rails.cache
46
40
  end
47
-
48
- def clear_local
49
- if Kasket.cache.respond_to?(:with_local_cache)
50
- Kasket.cache.send(:local_cache).try(:clear)
51
- end
52
- end
53
41
  end
@@ -66,8 +66,8 @@ module Kasket
66
66
  end
67
67
 
68
68
  def has_kasket_on(*args)
69
- attributes = args.sort! { |x, y| x.to_s <=> y.to_s }
70
- if attributes != [:id] && !kasket_indices.include?([:id])
69
+ attributes = args.sort_by!(&:to_s)
70
+ if attributes != [:id] && !has_kasket_index_on?([:id])
71
71
  has_kasket_on(:id)
72
72
  end
73
73
 
@@ -79,7 +79,14 @@ module Kasket
79
79
  extend ReadMixin unless methods.map(&:to_sym).include?(:find_by_sql_with_kasket)
80
80
  end
81
81
 
82
+ def kasket_expires_in(time)
83
+ @kasket_ttl = time
84
+ end
85
+
86
+ attr_reader :kasket_ttl
87
+
82
88
  private
89
+
83
90
  def quoted_value_for_column(value, column)
84
91
  if column
85
92
  casted_value = if column.respond_to?(:type_cast_for_database)
@@ -2,13 +2,14 @@ module Kasket
2
2
  module DirtyMixin
3
3
  def kasket_dirty_methods(*method_names)
4
4
  method_names.each do |method|
5
- unless method_defined?("without_kasket_update_#{method}")
6
- alias_method("without_kasket_update_#{method}", method)
7
- define_method(method) do |*args|
8
- result = send("without_kasket_update_#{method}", *args)
9
- clear_kasket_indices
10
- result
11
- end
5
+ without = "without_kasket_update_#{method}"
6
+ return if method_defined? without
7
+
8
+ alias_method without, method
9
+ define_method method do |*args, &block|
10
+ result = send(without, *args, &block)
11
+ clear_kasket_indices
12
+ result
12
13
  end
13
14
  end
14
15
  end
@@ -49,36 +49,28 @@ module Kasket
49
49
 
50
50
  protected
51
51
 
52
- def missing_records_from_db(missing_keys)
53
- return {} if missing_keys.empty?
52
+ def missing_records_from_db(missing_keys)
53
+ return {} if missing_keys.empty?
54
54
 
55
- id_key_map = Hash[missing_keys.map{|key| [key.split('=').last.to_i, key] }]
55
+ id_key_map = Hash[missing_keys.map{|key| [key.split('=').last.to_i, key] }]
56
56
 
57
- found = without_kasket { where(:id => id_key_map.keys).to_a }
58
- found.each(&:store_in_kasket)
59
- Hash[found.map{|record| [id_key_map[record.id], record] }]
60
- end
61
-
62
- def store_in_kasket(key, records)
63
- if records.size == 1
64
- if records.first.kasket_cacheable?
65
- Kasket.cache.write(key, records.first.attributes_before_type_cast.dup)
66
- end
67
- elsif records.empty?
68
- ActiveRecord::Base.logger.info("[KASKET] would have stored an empty resultset") if ActiveRecord::Base.logger
69
- elsif records.size <= Kasket::CONFIGURATION[:max_collection_size]
70
- if records.all?(&:kasket_cacheable?)
71
- instance_keys = records.map do |record|
72
- instance_key = kasket_key_for_id(record.id)
73
- Kasket.cache.write(instance_key, record.attributes_before_type_cast.dup)
74
- instance_key
75
- end
57
+ found = without_kasket { where(:id => id_key_map.keys).to_a }
58
+ found.each(&:store_in_kasket)
59
+ Hash[found.map{|record| [id_key_map[record.id], record] }]
60
+ end
76
61
 
77
- Kasket.cache.write(key, instance_keys) if key.is_a?(String)
78
- end
62
+ def store_in_kasket(key, records)
63
+ if records.size == 1
64
+ records.first.store_in_kasket(key)
65
+ elsif records.empty?
66
+ ActiveRecord::Base.logger.info("[KASKET] would have stored an empty resultset") if ActiveRecord::Base.logger
67
+ elsif records.size <= Kasket::CONFIGURATION[:max_collection_size]
68
+ if records.all?(&:kasket_cacheable?)
69
+ instance_keys = records.map(&:store_in_kasket)
70
+ Kasket.cache.write(key, instance_keys)
79
71
  end
80
- records
81
72
  end
82
-
73
+ records
74
+ end
83
75
  end
84
76
  end
@@ -1,8 +1,8 @@
1
1
  module Kasket
2
2
  class Version
3
3
  MAJOR = 4
4
- MINOR = 0
5
- PATCH = 1
4
+ MINOR = 1
5
+ PATCH = 0
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  PROTOCOL = 4
8
8
  end
@@ -29,9 +29,11 @@ module Kasket
29
29
  true
30
30
  end
31
31
 
32
- def store_in_kasket
33
- if kasket_cacheable? && kasket_key
34
- Kasket.cache.write(kasket_key, @attributes.to_h.dup)
32
+ def store_in_kasket(key = kasket_key)
33
+ if kasket_cacheable? && key
34
+ options = { expires_in: self.class.kasket_ttl } if self.class.kasket_ttl
35
+ Kasket.cache.write(key, attributes_before_type_cast.dup, options)
36
+ key
35
37
  end
36
38
  end
37
39
 
@@ -62,9 +64,15 @@ module Kasket
62
64
  end
63
65
  end
64
66
 
65
- def reload_with_kasket_clearing(*args)
66
- Kasket.clear_local
67
- reload_without_kasket_clearing(*args)
67
+ def reload(*args)
68
+ clear_kasket_indices
69
+ super
70
+ end
71
+
72
+ def update_column(*args)
73
+ result = super
74
+ clear_kasket_indices
75
+ result
68
76
  end
69
77
  end
70
78
 
@@ -80,9 +88,6 @@ module Kasket
80
88
  model_class.after_touch :clear_kasket_indices
81
89
  model_class.after_destroy :clear_kasket_indices
82
90
 
83
- model_class.alias_method_chain :reload, :kasket_clearing
84
-
85
-
86
91
  class << model_class
87
92
  alias_method_chain :transaction, :kasket_disabled
88
93
  alias_method_chain :update_counters, :kasket_clearing
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kasket
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mick Staugaard
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-24 00:00:00.000000000 Z
12
+ date: 2015-11-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -129,6 +129,20 @@ dependencies:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: timecop
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
132
146
  description: puts a cap on your queries
133
147
  email:
134
148
  - mick@zendesk.com
@@ -144,7 +158,6 @@ files:
144
158
  - lib/kasket/query_parser.rb
145
159
  - lib/kasket/read_mixin.rb
146
160
  - lib/kasket/relation_mixin.rb
147
- - lib/kasket/reload_association_mixin.rb
148
161
  - lib/kasket/select_manager_mixin.rb
149
162
  - lib/kasket/version.rb
150
163
  - lib/kasket/visitor.rb
@@ -169,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
182
  version: '0'
170
183
  requirements: []
171
184
  rubyforge_project:
172
- rubygems_version: 2.2.2
185
+ rubygems_version: 2.4.5.1
173
186
  signing_key:
174
187
  specification_version: 4
175
188
  summary: A write back caching layer on active record
@@ -1,18 +0,0 @@
1
- module Kasket
2
- module ReloadAssociationMixin
3
- def reload_with_kasket_clearing(*args)
4
- if loaded?
5
- Kasket.clear_local if target.class.include?(WriteMixin)
6
- else
7
- target_class = (reflection.options[:polymorphic] ? (respond_to?(:klass) ? klass : association_class) : reflection.klass)
8
- Kasket.clear_local if target_class && target_class.include?(WriteMixin)
9
- end
10
-
11
- reload_without_kasket_clearing(*args)
12
- end
13
-
14
- def self.included(base)
15
- base.alias_method_chain :reload, :kasket_clearing
16
- end
17
- end
18
- end