kasket 3.1.5 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kasket.rb +0 -6
- data/lib/kasket/configuration_mixin.rb +0 -1
- data/lib/kasket/dirty_mixin.rb +0 -1
- data/lib/kasket/query_parser.rb +1 -14
- data/lib/kasket/read_mixin.rb +1 -2
- data/lib/kasket/reload_association_mixin.rb +1 -3
- data/lib/kasket/version.rb +2 -3
- data/lib/kasket/visitor.rb +15 -15
- data/lib/kasket/write_mixin.rb +0 -1
- metadata +49 -73
- data/test/cache_expiry_test.rb +0 -49
- data/test/cacheable_test.rb +0 -58
- data/test/configuration_mixin_test.rb +0 -44
- data/test/database.yml +0 -7
- data/test/dirty_test.rb +0 -16
- data/test/find_one_test.rb +0 -61
- data/test/find_some_test.rb +0 -55
- data/test/fixtures/authors.yml +0 -7
- data/test/fixtures/blogs.yml +0 -5
- data/test/fixtures/comments.yml +0 -16
- data/test/fixtures/posts.yml +0 -24
- data/test/helper.rb +0 -84
- data/test/parser_test.rb +0 -153
- data/test/read_mixin_test.rb +0 -89
- data/test/reload_test.rb +0 -17
- data/test/schema.rb +0 -31
- data/test/test_models.rb +0 -44
- data/test/transaction_test.rb +0 -27
- data/test/visitor_test.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fd8b1112932a3d14ed1e43ab61ad826ba02c5f0
|
4
|
+
data.tar.gz: 997f6891f0df65c1299a3d0da4f1e990a0c6a0fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9eb57e261693839d9b4d81060fadf64737f528c8d37adcc3d3f98459e2947832dbcc3ac96379c2775cde2486731ccf5f1a3178a9ac49e376f93574154a1f7b90
|
7
|
+
data.tar.gz: 19c1289828483003fb8a979969aee6198ac4cbdbe47452b82cbbaa15dee26280c31f7a91559994afa4b856f960fce4411daa1ba9297bac265d6092f347173d32
|
data/lib/kasket.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
require 'active_record'
|
3
2
|
require 'active_support'
|
4
3
|
|
@@ -16,8 +15,6 @@ module Kasket
|
|
16
15
|
autoload :SelectManagerMixin, 'kasket/select_manager_mixin'
|
17
16
|
autoload :RelationMixin, 'kasket/relation_mixin'
|
18
17
|
|
19
|
-
AR30 = (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0)
|
20
|
-
|
21
18
|
CONFIGURATION = {:max_collection_size => 100}
|
22
19
|
|
23
20
|
module_function
|
@@ -36,9 +33,6 @@ module Kasket
|
|
36
33
|
|
37
34
|
if options[:assoliations_reload_hack]
|
38
35
|
ActiveRecord::Associations::BelongsToAssociation.send(:include, Kasket::ReloadAssociationMixin)
|
39
|
-
if ActiveRecord::VERSION::MAJOR == 2 || AR30
|
40
|
-
ActiveRecord::Associations::BelongsToPolymorphicAssociation.send(:include, Kasket::ReloadAssociationMixin)
|
41
|
-
end
|
42
36
|
ActiveRecord::Associations::HasOneThroughAssociation.send(:include, Kasket::ReloadAssociationMixin)
|
43
37
|
end
|
44
38
|
end
|
data/lib/kasket/dirty_mixin.rb
CHANGED
data/lib/kasket/query_parser.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Kasket
|
3
2
|
class QueryParser
|
4
3
|
# Examples:
|
@@ -11,11 +10,7 @@ module Kasket
|
|
11
10
|
|
12
11
|
def initialize(model_class)
|
13
12
|
@model_class = model_class
|
14
|
-
@supported_query_pattern =
|
15
|
-
/^select\s+(?:`#{@model_class.table_name}`.)?\* from (?:`|")#{@model_class.table_name}(?:`|") where (.*?)\s*$/i
|
16
|
-
else
|
17
|
-
/^select \* from (?:`|")#{@model_class.table_name}(?:`|") where \((.*)\)(|\s+limit 1)\s*$/i
|
18
|
-
end
|
13
|
+
@supported_query_pattern = /^select \* from (?:`|")#{@model_class.table_name}(?:`|") where \((.*)\)(|\s+limit 1)\s*$/i
|
19
14
|
@table_and_column_pattern = /(?:(?:`|")?#{@model_class.table_name}(?:`|")?\.)?(?:`|")?([a-zA-Z]\w*)(?:`|")?/ # Matches: `users`.id, `users`.`id`, users.id, id
|
20
15
|
@key_eq_value_pattern = /^[\(\s]*#{@table_and_column_pattern}\s+(=|IN)\s+#{VALUE}[\)\s]*$/ # Matches: KEY = VALUE, (KEY = VALUE), ()(KEY = VALUE))
|
21
16
|
end
|
@@ -23,14 +18,6 @@ module Kasket
|
|
23
18
|
def parse(sql)
|
24
19
|
if match = @supported_query_pattern.match(sql)
|
25
20
|
where, limit = match[1], match[2]
|
26
|
-
if AR30
|
27
|
-
return if where =~ / (order by|group by|join|having) /i
|
28
|
-
if where =~ /limit \d+\s*$/i
|
29
|
-
# limit is harder to find in rails 3.0 since where does not use surrounding braces
|
30
|
-
return unless where =~ /(.*?)(\s+limit 1)\s*$/i
|
31
|
-
where, limit = $1, $2
|
32
|
-
end
|
33
|
-
end
|
34
21
|
|
35
22
|
query = Hash.new
|
36
23
|
query[:attributes] = sorted_attribute_value_pairs(where)
|
data/lib/kasket/read_mixin.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Kasket
|
3
2
|
module ReadMixin
|
4
3
|
|
@@ -55,7 +54,7 @@ module Kasket
|
|
55
54
|
|
56
55
|
id_key_map = Hash[missing_keys.map{|key| [key.split('=').last.to_i, key] }]
|
57
56
|
|
58
|
-
found = without_kasket {
|
57
|
+
found = without_kasket { where(:id => id_key_map.keys).to_a }
|
59
58
|
found.each(&:store_in_kasket)
|
60
59
|
Hash[found.map{|record| [id_key_map[record.id], record] }]
|
61
60
|
end
|
@@ -1,12 +1,10 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Kasket
|
3
2
|
module ReloadAssociationMixin
|
4
3
|
def reload_with_kasket_clearing(*args)
|
5
4
|
if loaded?
|
6
5
|
Kasket.clear_local if target.class.include?(WriteMixin)
|
7
6
|
else
|
8
|
-
|
9
|
-
target_class = (refl.options[:polymorphic] ? (respond_to?(:klass) ? klass : association_class) : refl.klass)
|
7
|
+
target_class = (reflection.options[:polymorphic] ? (respond_to?(:klass) ? klass : association_class) : reflection.klass)
|
10
8
|
Kasket.clear_local if target_class && target_class.include?(WriteMixin)
|
11
9
|
end
|
12
10
|
|
data/lib/kasket/version.rb
CHANGED
data/lib/kasket/visitor.rb
CHANGED
@@ -24,8 +24,8 @@ module Kasket
|
|
24
24
|
@model_class.columns_hash[name.to_s]
|
25
25
|
end
|
26
26
|
|
27
|
-
def visit_Arel_Nodes_SelectStatement(node)
|
28
|
-
return :unsupported if
|
27
|
+
def visit_Arel_Nodes_SelectStatement(node, *_)
|
28
|
+
return :unsupported if node.with
|
29
29
|
return :unsupported if node.offset
|
30
30
|
return :unsupported if node.lock
|
31
31
|
return :unsupported if node.orders.any?
|
@@ -42,11 +42,11 @@ module Kasket
|
|
42
42
|
query
|
43
43
|
end
|
44
44
|
|
45
|
-
def visit_Arel_Nodes_SelectCore(node)
|
45
|
+
def visit_Arel_Nodes_SelectCore(node, *_)
|
46
46
|
return :unsupported if node.groups.any?
|
47
47
|
return :unsupported if node.having
|
48
|
-
return :unsupported if
|
49
|
-
return :unsupported if
|
48
|
+
return :unsupported if node.set_quantifier
|
49
|
+
return :unsupported if (!node.source || node.source.empty?)
|
50
50
|
return :unsupported if node.projections.size != 1
|
51
51
|
|
52
52
|
select = node.projections[0]
|
@@ -60,45 +60,45 @@ module Kasket
|
|
60
60
|
parts.include?(:unsupported) ? :unsupported : parts
|
61
61
|
end
|
62
62
|
|
63
|
-
def visit_Arel_Nodes_Limit(node)
|
63
|
+
def visit_Arel_Nodes_Limit(node, *_)
|
64
64
|
{:limit => node.value.to_i}
|
65
65
|
end
|
66
66
|
|
67
|
-
def visit_Arel_Nodes_JoinSource(node)
|
67
|
+
def visit_Arel_Nodes_JoinSource(node, *_)
|
68
68
|
return :unsupported if !node.left || node.right.any?
|
69
69
|
return :unsupported if !node.left.is_a?(Arel::Table)
|
70
70
|
visit(node.left)
|
71
71
|
end
|
72
72
|
|
73
|
-
def visit_Arel_Table(node)
|
73
|
+
def visit_Arel_Table(node, *_)
|
74
74
|
{:from => node.name}
|
75
75
|
end
|
76
76
|
|
77
|
-
def visit_Arel_Nodes_And(node)
|
77
|
+
def visit_Arel_Nodes_And(node, *_)
|
78
78
|
attributes = node.children.map { |child| visit(child) }
|
79
79
|
return :unsupported if attributes.include?(:unsupported)
|
80
80
|
attributes.sort! { |pair1, pair2| pair1[0].to_s <=> pair2[0].to_s }
|
81
81
|
{ :attributes => attributes }
|
82
82
|
end
|
83
83
|
|
84
|
-
def visit_Arel_Nodes_In(node)
|
84
|
+
def visit_Arel_Nodes_In(node, *_)
|
85
85
|
left = visit(node.left)
|
86
86
|
return :unsupported if left != :id
|
87
87
|
|
88
88
|
[left, visit(node.right)]
|
89
89
|
end
|
90
90
|
|
91
|
-
def visit_Arel_Nodes_Equality(node)
|
91
|
+
def visit_Arel_Nodes_Equality(node, *_)
|
92
92
|
right = node.right
|
93
93
|
[visit(node.left), right ? visit(right) : nil]
|
94
94
|
end
|
95
95
|
|
96
|
-
def visit_Arel_Attributes_Attribute(node)
|
96
|
+
def visit_Arel_Attributes_Attribute(node, *_)
|
97
97
|
self.last_column = column_for(node.name)
|
98
98
|
node.name.to_sym
|
99
99
|
end
|
100
100
|
|
101
|
-
def literal(node)
|
101
|
+
def literal(node, *_)
|
102
102
|
if node == '?'
|
103
103
|
column, value = @binds.shift
|
104
104
|
value.to_s
|
@@ -108,11 +108,11 @@ module Kasket
|
|
108
108
|
end
|
109
109
|
|
110
110
|
# only gets used on 1.8.7
|
111
|
-
def visit_Arel_Nodes_BindParam(x)
|
111
|
+
def visit_Arel_Nodes_BindParam(x, *_)
|
112
112
|
@binds.shift[1]
|
113
113
|
end
|
114
114
|
|
115
|
-
def visit_Array(node)
|
115
|
+
def visit_Array(node, *_)
|
116
116
|
node.map {|value| quoted(value) }
|
117
117
|
end
|
118
118
|
|
data/lib/kasket/write_mixin.rb
CHANGED
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: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mick Staugaard
|
@@ -9,112 +9,126 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
-
- - <
|
20
|
+
version: '3.2'
|
21
|
+
- - "<"
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: '
|
23
|
+
version: '4.2'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- -
|
28
|
+
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
31
|
-
- - <
|
30
|
+
version: '3.2'
|
31
|
+
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '4.2'
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: rake
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
type: :development
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: bundler
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: appraisal
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.5.0
|
69
69
|
type: :development
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.5.0
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
|
-
name:
|
77
|
+
name: mocha
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
|
-
name:
|
91
|
+
name: wwtd
|
92
92
|
requirement: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
type: :development
|
98
98
|
prerelease: false
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
105
|
+
name: minitest
|
106
106
|
requirement: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '0'
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: minitest-rg
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
116
123
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
124
|
+
version: '0'
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
118
132
|
description: puts a cap on your queries
|
119
133
|
email:
|
120
134
|
- mick@zendesk.com
|
@@ -123,6 +137,8 @@ executables: []
|
|
123
137
|
extensions: []
|
124
138
|
extra_rdoc_files: []
|
125
139
|
files:
|
140
|
+
- README.rdoc
|
141
|
+
- lib/kasket.rb
|
126
142
|
- lib/kasket/configuration_mixin.rb
|
127
143
|
- lib/kasket/dirty_mixin.rb
|
128
144
|
- lib/kasket/query_parser.rb
|
@@ -133,27 +149,6 @@ files:
|
|
133
149
|
- lib/kasket/version.rb
|
134
150
|
- lib/kasket/visitor.rb
|
135
151
|
- lib/kasket/write_mixin.rb
|
136
|
-
- lib/kasket.rb
|
137
|
-
- README.rdoc
|
138
|
-
- test/cache_expiry_test.rb
|
139
|
-
- test/cacheable_test.rb
|
140
|
-
- test/configuration_mixin_test.rb
|
141
|
-
- test/database.yml
|
142
|
-
- test/dirty_test.rb
|
143
|
-
- test/find_one_test.rb
|
144
|
-
- test/find_some_test.rb
|
145
|
-
- test/fixtures/authors.yml
|
146
|
-
- test/fixtures/blogs.yml
|
147
|
-
- test/fixtures/comments.yml
|
148
|
-
- test/fixtures/posts.yml
|
149
|
-
- test/helper.rb
|
150
|
-
- test/parser_test.rb
|
151
|
-
- test/read_mixin_test.rb
|
152
|
-
- test/reload_test.rb
|
153
|
-
- test/schema.rb
|
154
|
-
- test/test_models.rb
|
155
|
-
- test/transaction_test.rb
|
156
|
-
- test/visitor_test.rb
|
157
152
|
homepage: http://github.com/zendesk/kasket
|
158
153
|
licenses:
|
159
154
|
- Apache License Version 2.0
|
@@ -164,37 +159,18 @@ require_paths:
|
|
164
159
|
- lib
|
165
160
|
required_ruby_version: !ruby/object:Gem::Requirement
|
166
161
|
requirements:
|
167
|
-
- -
|
162
|
+
- - ">="
|
168
163
|
- !ruby/object:Gem::Version
|
169
164
|
version: '0'
|
170
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
166
|
requirements:
|
172
|
-
- -
|
167
|
+
- - ">="
|
173
168
|
- !ruby/object:Gem::Version
|
174
169
|
version: '0'
|
175
170
|
requirements: []
|
176
171
|
rubyforge_project:
|
177
|
-
rubygems_version: 2.
|
172
|
+
rubygems_version: 2.2.2
|
178
173
|
signing_key:
|
179
174
|
specification_version: 4
|
180
175
|
summary: A write back caching layer on active record
|
181
|
-
test_files:
|
182
|
-
- test/cache_expiry_test.rb
|
183
|
-
- test/cacheable_test.rb
|
184
|
-
- test/configuration_mixin_test.rb
|
185
|
-
- test/database.yml
|
186
|
-
- test/dirty_test.rb
|
187
|
-
- test/find_one_test.rb
|
188
|
-
- test/find_some_test.rb
|
189
|
-
- test/fixtures/authors.yml
|
190
|
-
- test/fixtures/blogs.yml
|
191
|
-
- test/fixtures/comments.yml
|
192
|
-
- test/fixtures/posts.yml
|
193
|
-
- test/helper.rb
|
194
|
-
- test/parser_test.rb
|
195
|
-
- test/read_mixin_test.rb
|
196
|
-
- test/reload_test.rb
|
197
|
-
- test/schema.rb
|
198
|
-
- test/test_models.rb
|
199
|
-
- test/transaction_test.rb
|
200
|
-
- test/visitor_test.rb
|
176
|
+
test_files: []
|