kasket 4.0.1 → 4.1.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
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