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 +4 -4
- data/README.rdoc +0 -4
- data/lib/kasket.rb +0 -12
- data/lib/kasket/configuration_mixin.rb +9 -2
- data/lib/kasket/dirty_mixin.rb +8 -7
- data/lib/kasket/read_mixin.rb +18 -26
- data/lib/kasket/version.rb +2 -2
- data/lib/kasket/write_mixin.rb +14 -9
- metadata +17 -4
- data/lib/kasket/reload_association_mixin.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25efa3724a0e5b5d6b1bf69dba58de2afd6bb000
|
4
|
+
data.tar.gz: cb0b2b1b91897768971e7bfcc0299ff30254644a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b2ae0752068653cf1edaa1f17dc8ca7aee2c6d840f564134e743968fc849e72db1da4d56e2b9f626f2782a94a5702873fee87e409828c75fd88c97577ffb1c9
|
7
|
+
data.tar.gz: 7e7b93830ad115b0c70fc29d442b1f2479adeee06326a06b7d6c106118af5e92afa717be3b3ab0638bf3bcb86dec1d3647379eb48ee30a4f7e9c5116d14ec34f
|
data/README.rdoc
CHANGED
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.
|
70
|
-
if attributes != [: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)
|
data/lib/kasket/dirty_mixin.rb
CHANGED
@@ -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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
data/lib/kasket/read_mixin.rb
CHANGED
@@ -49,36 +49,28 @@ module Kasket
|
|
49
49
|
|
50
50
|
protected
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
def missing_records_from_db(missing_keys)
|
53
|
+
return {} if missing_keys.empty?
|
54
54
|
|
55
|
-
|
55
|
+
id_key_map = Hash[missing_keys.map{|key| [key.split('=').last.to_i, key] }]
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
78
|
-
|
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
|
data/lib/kasket/version.rb
CHANGED
data/lib/kasket/write_mixin.rb
CHANGED
@@ -29,9 +29,11 @@ module Kasket
|
|
29
29
|
true
|
30
30
|
end
|
31
31
|
|
32
|
-
def store_in_kasket
|
33
|
-
if kasket_cacheable? &&
|
34
|
-
|
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
|
66
|
-
|
67
|
-
|
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
|
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-
|
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.
|
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
|