kasket 0.5.2 → 0.5.3
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.
- data/VERSION +1 -1
- data/lib/kasket.rb +16 -6
- data/lib/kasket/active_record_patches.rb +56 -0
- data/lib/kasket/rack_middleware.rb +13 -0
- data/lib/kasket/reload_association_mixin.rb +3 -4
- metadata +3 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.3
|
data/lib/kasket.rb
CHANGED
@@ -2,11 +2,14 @@ require 'rubygems'
|
|
2
2
|
require 'active_record'
|
3
3
|
require 'active_support'
|
4
4
|
|
5
|
-
require 'kasket/
|
6
|
-
require 'kasket/reload_association_mixin'
|
7
|
-
require 'kasket/cache'
|
5
|
+
require 'kasket/active_record_patches'
|
8
6
|
|
9
7
|
module Kasket
|
8
|
+
autoload :Cache, 'kasket/cache'
|
9
|
+
autoload :ConfigurationMixin, 'kasket/configuration_mixin'
|
10
|
+
autoload :ReloadAssociationMixin, 'kasket/reload_association_mixin'
|
11
|
+
autoload :RackMiddleware, 'kasket/rack_middleware'
|
12
|
+
|
10
13
|
CONFIGURATION = {:max_collection_size => 100}
|
11
14
|
|
12
15
|
module_function
|
@@ -23,13 +26,20 @@ module Kasket
|
|
23
26
|
ActiveRecord::Associations::BelongsToPolymorphicAssociation.send(:include, Kasket::ReloadAssociationMixin)
|
24
27
|
ActiveRecord::Associations::HasOneThroughAssociation.send(:include, Kasket::ReloadAssociationMixin)
|
25
28
|
|
26
|
-
#sets up local cache clearing
|
29
|
+
#sets up local cache clearing on rack
|
30
|
+
begin
|
31
|
+
ActionController::Dispatcher.middleware.use(Kasket::RackMiddleware)
|
32
|
+
rescue NameError => e
|
33
|
+
puts('WARNING: The kasket rack middleware is not in your rack stack')
|
34
|
+
end
|
35
|
+
|
36
|
+
#sets up local cache clearing before each request.
|
37
|
+
#this is done to make it work for non rack rails and for functional tests
|
27
38
|
begin
|
28
|
-
ApplicationController.
|
39
|
+
ApplicationController.before_filter do
|
29
40
|
Kasket.cache.clear_local
|
30
41
|
end
|
31
42
|
rescue NameError => e
|
32
|
-
|
33
43
|
end
|
34
44
|
|
35
45
|
#sets up local cache clearing after each test case
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Kasket
|
2
|
+
module FixForAssociationAccessorMethods
|
3
|
+
def association_accessor_methods(reflection, association_proxy_class)
|
4
|
+
define_method(reflection.name) do |*params|
|
5
|
+
force_reload = params.first unless params.empty?
|
6
|
+
association = association_instance_get(reflection.name)
|
7
|
+
|
8
|
+
if association.nil? || force_reload
|
9
|
+
association = association_proxy_class.new(self, reflection)
|
10
|
+
retval = force_reload ? association.reload : association.__send__(:load_target)
|
11
|
+
if retval.nil? and association_proxy_class == ActiveRecord::Associations::BelongsToAssociation
|
12
|
+
association_instance_set(reflection.name, nil)
|
13
|
+
return nil
|
14
|
+
end
|
15
|
+
association_instance_set(reflection.name, association)
|
16
|
+
end
|
17
|
+
|
18
|
+
association.target.nil? ? nil : association
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method("loaded_#{reflection.name}?") do
|
22
|
+
association = association_instance_get(reflection.name)
|
23
|
+
association && association.loaded?
|
24
|
+
end
|
25
|
+
|
26
|
+
define_method("#{reflection.name}=") do |new_value|
|
27
|
+
association = association_instance_get(reflection.name)
|
28
|
+
|
29
|
+
if association.nil? || association.target != new_value
|
30
|
+
association = association_proxy_class.new(self, reflection)
|
31
|
+
end
|
32
|
+
|
33
|
+
if association_proxy_class == ActiveRecord::Associations::HasOneThroughAssociation
|
34
|
+
association.create_through_record(new_value)
|
35
|
+
if new_record?
|
36
|
+
association_instance_set(reflection.name, new_value.nil? ? nil : association)
|
37
|
+
else
|
38
|
+
self.send(reflection.name, new_value)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
association.replace(new_value)
|
42
|
+
association_instance_set(reflection.name, new_value.nil? ? nil : association)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method("set_#{reflection.name}_target") do |target|
|
47
|
+
return if target.nil? and association_proxy_class == ActiveRecord::Associations::BelongsToAssociation
|
48
|
+
association = association_proxy_class.new(self, reflection)
|
49
|
+
association.target = target
|
50
|
+
association_instance_set(reflection.name, association)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
ActiveRecord::Base.extend Kasket::FixForAssociationAccessorMethods
|
@@ -3,12 +3,11 @@ module Kasket
|
|
3
3
|
def reload_with_kasket_clearing(*args)
|
4
4
|
if loaded?
|
5
5
|
clear_local_kasket_indices if respond_to?(:clear_local_kasket_indices)
|
6
|
+
else
|
7
|
+
target_class = proxy_reflection.options[:polymorphic] ? association_class : proxy_reflection.klass
|
8
|
+
Kasket.cache.delete_matched_local(/^#{target_class.kasket_key_prefix}/) if target_class.respond_to?(:kasket_key_prefix)
|
6
9
|
end
|
7
10
|
|
8
|
-
# or maybe something like this?
|
9
|
-
#target_class = proxy_reflection.options[:polymorphic] ? association_class : proxy_reflection.klass
|
10
|
-
#Kasket.cache.delete_matched_local(/^#{target_class.kasket_key_prefix}/) if target_class.respond_to?(:kasket_key_prefix)
|
11
|
-
|
12
11
|
reload_without_kasket_clearing(*args)
|
13
12
|
end
|
14
13
|
|
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: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mick Staugaard
|
@@ -49,10 +49,12 @@ files:
|
|
49
49
|
- Rakefile
|
50
50
|
- VERSION
|
51
51
|
- lib/kasket.rb
|
52
|
+
- lib/kasket/active_record_patches.rb
|
52
53
|
- lib/kasket/cache.rb
|
53
54
|
- lib/kasket/conditions_parser.rb
|
54
55
|
- lib/kasket/configuration_mixin.rb
|
55
56
|
- lib/kasket/dirty_mixin.rb
|
57
|
+
- lib/kasket/rack_middleware.rb
|
56
58
|
- lib/kasket/read_mixin.rb
|
57
59
|
- lib/kasket/reload_association_mixin.rb
|
58
60
|
- lib/kasket/write_mixin.rb
|