flagpole_sitta 0.5.1 → 0.5.9
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/app/helpers/flagpole_sitta_helper.rb +44 -40
- data/lib/flagpole_sitta/cache_sitta.rb +35 -89
- data/lib/flagpole_sitta/version.rb +1 -1
- metadata +1 -1
@@ -1,67 +1,71 @@
|
|
1
1
|
module FlagpoleSittaHelper
|
2
2
|
|
3
3
|
def update_index_array_cache model, key
|
4
|
-
model.try(:
|
4
|
+
model.try(:update_array_cache, key)
|
5
5
|
end
|
6
6
|
|
7
7
|
def update_show_array_cache model, key, route_id
|
8
|
-
model.try(:
|
8
|
+
model.try(:update_array_cache, key, route_id)
|
9
9
|
end
|
10
10
|
|
11
11
|
#AR - cache_sitta helper
|
12
|
-
|
13
12
|
#NOTE This is not safe for .builder xml files.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
13
|
+
#Options
|
14
|
+
#-------
|
15
|
+
#:section
|
16
|
+
#The section of the page the cache represents. This is
|
17
|
+
#best used in connection with -content_for. Can be any
|
18
|
+
#string you want it to be. If not provided will default to
|
19
|
+
#body. Also looks for the calls using sections. Will assume calls
|
20
|
+
#are in the instance variable '@#{options[:section]_calls'
|
21
|
+
#-------
|
22
|
+
#:model
|
23
|
+
#The model of the object, or objects that you want to link
|
24
|
+
#the cache too. Pass the actually model, or an array of models.
|
25
|
+
#Must also have a corresponding route_id. If model is an array,
|
26
|
+
#route_id must also be an array of equal length. model[i] is
|
27
|
+
#connected to route_id[i].
|
28
|
+
#-------
|
29
|
+
#:route_id
|
30
|
+
#The unique identifier of the object, most likely what you route on
|
31
|
+
#for showing the object or objects that you want to link
|
32
|
+
#the cache too. Pass as a string, or an array of strings.
|
33
|
+
#Must also have a corresponding model. If route_id is an array,
|
34
|
+
#model must also be an array of equal length. model[i] is
|
35
|
+
#connected to route_id[i].
|
36
|
+
#-------
|
37
|
+
#:models_in_index
|
26
38
|
#Use this if the fragment you are rendering is an index
|
27
39
|
#pass it all the different types of models/classes could be
|
28
40
|
#included in the index. All the include classes must have cache
|
29
41
|
#sitta enabled. The cache for the used index pages will then be
|
30
42
|
#wiped clear when anyone of these models/classes has an object
|
31
43
|
#created or updated.
|
44
|
+
#-------
|
45
|
+
#:index_only
|
46
|
+
#Use this if the cache should not be associated with any object,
|
47
|
+
#but rather only a model. Use this if your cache is an index, or
|
48
|
+
#can be 'random'.
|
49
|
+
#-------
|
50
|
+
#:sub_route_id
|
51
|
+
#Use this if options on the url can result in a difference in
|
52
|
+
#the cache. So if you had an page where you could pass
|
53
|
+
#in a year and month would be a great place for this.
|
54
|
+
#That way your caching each possible version of the page
|
55
|
+
#instead of just one.
|
56
|
+
#-------
|
57
|
+
#:calls_args
|
58
|
+
#Any args you want to pass to your calls. Can only take one argument.
|
59
|
+
#The best idea is to pass an option hash.
|
32
60
|
def cache_sitta options={}, &block
|
33
61
|
|
34
|
-
#AR - If its a string, then just use that value, other wise it
|
35
|
-
#assumes that the route_id is a proc or lamdba and call its
|
36
|
-
#with the provide args.
|
37
|
-
|
38
|
-
if options[:route_id_args]
|
39
|
-
options[:route_id] = options[:route_id].call(options[:route_id_args])
|
40
|
-
elsif options[:route_id].class.eql?(Proc)
|
41
|
-
options[:route_id] = options[:route_id].call()
|
42
|
-
end
|
43
|
-
|
44
62
|
if options[:route_id].class.eql?(Array)
|
45
63
|
main_route_id = options[:route_id][0]
|
46
64
|
else
|
47
65
|
main_route_id = options[:route_id]
|
48
66
|
end
|
49
67
|
|
50
|
-
|
51
|
-
#Use subroute idea if the view can differ on things like current day, or any type of passed params that can effect how
|
52
|
-
#the page will look.
|
53
|
-
if options[:sub_route_id_args]
|
54
|
-
options[:sub_route_id] = options[:sub_route_id].call(options[:sub_route_id_args])
|
55
|
-
elsif options[:sub_route_id_args].class.eql?(Proc)
|
56
|
-
options[:sub_route_id] = options[:sub_route_id].call()
|
57
|
-
end
|
58
|
-
|
59
68
|
if options[:model]
|
60
|
-
if options[:model_args]
|
61
|
-
options[:model] = options[:model].call(options[:model_args])
|
62
|
-
elsif options[:model].class.eql?(Proc)
|
63
|
-
options[:model] = options[:model].call()
|
64
|
-
end
|
65
69
|
|
66
70
|
if options[:model].class.eql?(Array)
|
67
71
|
main_model = options[:model][0]
|
@@ -115,7 +119,7 @@ module FlagpoleSittaHelper
|
|
115
119
|
if calls
|
116
120
|
calls.each do |c|
|
117
121
|
if instance_variable_get("@#{c[0]}").nil?
|
118
|
-
if options[:calls_args]
|
122
|
+
if options[:calls_args] && (c.parameters.length > 0)
|
119
123
|
instance_variable_set("@#{c[0]}", c[1].call(options[:calls_args]))
|
120
124
|
else
|
121
125
|
instance_variable_set("@#{c[0]}", c[1].call())
|
@@ -10,56 +10,71 @@ module FlagpoleSitta
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
|
13
|
-
def
|
13
|
+
def mid_key_gen route_id
|
14
|
+
if route_id
|
15
|
+
mid_key = "#{route_id}/ShowArray"
|
16
|
+
else
|
17
|
+
mid_key = "IndexArray"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize_array_cache route_id = nil
|
22
|
+
|
23
|
+
|
24
|
+
mid_key = mid_key_gen route_id
|
14
25
|
|
15
26
|
clazz = self
|
16
27
|
|
17
28
|
flag = {:space => - 1}
|
18
29
|
|
19
|
-
Rails.cache.write("#{clazz}/
|
30
|
+
Rails.cache.write("#{clazz}/#{mid_key}/Flag", flag)
|
20
31
|
|
21
32
|
flag
|
22
33
|
|
23
34
|
end
|
24
35
|
|
25
|
-
def
|
36
|
+
def update_array_cache key, route_id = nil
|
37
|
+
|
38
|
+
mid_key = mid_key_gen route_id
|
26
39
|
|
27
40
|
clazz = self
|
28
41
|
|
29
|
-
flag = Rails.cache.read("#{clazz}/
|
42
|
+
flag = Rails.cache.read("#{clazz}/#{mid_key}/Flag")
|
30
43
|
|
31
44
|
#AR - If it doesn't exist start the process of creating it
|
32
45
|
if flag.nil?
|
33
|
-
flag =
|
46
|
+
flag = initialize_array_cache route_id
|
34
47
|
end
|
35
48
|
|
36
49
|
#AR - update the array's end point
|
37
50
|
flag[:space] = flag[:space] + 1
|
38
51
|
|
39
52
|
#AR - write out the new index at the end of the array
|
40
|
-
Rails.cache.write("#{clazz}
|
53
|
+
Rails.cache.write("#{clazz}/#{mid_key}/#{flag[:space]}", {:key => key})
|
41
54
|
|
42
55
|
#AR - update flag in the cache
|
43
|
-
Rails.cache.write("#{clazz}/
|
56
|
+
Rails.cache.write("#{clazz}/#{mid_key}/Flag", flag)
|
44
57
|
|
45
58
|
end
|
46
59
|
|
47
|
-
def
|
60
|
+
def each_cache route_id = nil, &block
|
61
|
+
|
62
|
+
mid_key = mid_key_gen route_id
|
48
63
|
|
49
64
|
clazz = self
|
50
65
|
|
51
|
-
flag = Rails.cache.read("#{clazz}/
|
66
|
+
flag = Rails.cache.read("#{clazz}/#{mid_key}/Flag")
|
52
67
|
|
53
68
|
#AR - If it doesn't exist start the process of creating it
|
54
69
|
if flag.nil?
|
55
|
-
flag =
|
70
|
+
flag = initialize_array_cache route_id
|
56
71
|
end
|
57
72
|
|
58
73
|
#AR - If there aren't any index do nothing.
|
59
74
|
#Else wise loop through every index.
|
60
75
|
#If it actually does exist then yield.
|
61
76
|
for i in 0..flag[:space] do
|
62
|
-
hash = Rails.cache.read("#{clazz}
|
77
|
+
hash = Rails.cache.read("#{clazz}/#{mid_key}/#{i}")
|
63
78
|
if hash
|
64
79
|
yield hash[:key]
|
65
80
|
end
|
@@ -69,86 +84,17 @@ module FlagpoleSitta
|
|
69
84
|
|
70
85
|
end
|
71
86
|
|
72
|
-
def
|
73
|
-
|
74
|
-
clazz = self
|
75
|
-
|
76
|
-
each_index_cache do |key|
|
77
|
-
Rails.cache.delete(key)
|
78
|
-
end
|
79
|
-
|
80
|
-
Rails.cache.delete("#{clazz}/IndexArray/Flag")
|
81
|
-
end
|
82
|
-
|
83
|
-
def initialize_show_array_cache route_id
|
84
|
-
|
85
|
-
clazz = self
|
86
|
-
|
87
|
-
#AR - Its negative one to stop the for loops in the each method if its empty
|
88
|
-
flag = {:space => - 1}
|
89
|
-
|
90
|
-
Rails.cache.write("#{clazz}/#{route_id}/ShowArray/Flag", flag)
|
91
|
-
|
92
|
-
flag
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
def update_show_array_cache key, route_id
|
97
|
-
|
98
|
-
clazz = self
|
99
|
-
|
100
|
-
flag = Rails.cache.read("#{clazz}/#{route_id}/ShowArray/Flag")
|
101
|
-
|
102
|
-
#AR - If it doesn't exist start the process of creating it
|
103
|
-
if flag.nil?
|
104
|
-
flag = initialize_show_array_cache(route_id)
|
105
|
-
end
|
106
|
-
|
107
|
-
#AR - Update the array's end point
|
108
|
-
flag[:space] = flag[:space] + 1
|
109
|
-
|
110
|
-
#AR - Write out the new index at the end of the array
|
111
|
-
Rails.cache.write("#{clazz}/#{route_id}/ShowArray/#{flag[:space]}", {:key => key})
|
112
|
-
|
113
|
-
#AR - Update flag in the cache
|
114
|
-
Rails.cache.write("#{clazz}/#{route_id}/ShowArray/Flag", flag)
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
def each_show_cache route_id, &block
|
87
|
+
def destroy_array_cache route_id = nil
|
119
88
|
|
120
|
-
|
121
|
-
|
122
|
-
flag = Rails.cache.read("#{clazz}/#{route_id}/ShowArray/Flag")
|
123
|
-
|
124
|
-
#AR - If it doesn't exist start the process of creating it
|
125
|
-
if flag.nil?
|
126
|
-
flag = initialize_show_array_cache(route_id)
|
127
|
-
end
|
128
|
-
|
129
|
-
#AR - If there aren't any shows caches do nothing, this happens when space is -1.
|
130
|
-
#Else wise loop through every caches.
|
131
|
-
#If it actually does exist then yield.
|
132
|
-
for i in 0..flag[:space] do
|
133
|
-
hash = Rails.cache.read("#{clazz}/#{route_id}/ShowArray/#{i}")
|
134
|
-
if hash
|
135
|
-
yield hash[:key]
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
nil
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
def destroy_show_array_cache route_id
|
89
|
+
mid_key = mid_key_gen route_id
|
144
90
|
|
145
91
|
clazz = self
|
146
92
|
|
147
|
-
|
148
|
-
Rails.cache.delete(
|
93
|
+
each_cache route_id do |key|
|
94
|
+
Rails.cache.delete(key)
|
149
95
|
end
|
150
96
|
|
151
|
-
Rails.cache.delete("#{clazz}/#{
|
97
|
+
Rails.cache.delete("#{clazz}/#{mid_key}/Flag")
|
152
98
|
end
|
153
99
|
|
154
100
|
end
|
@@ -167,18 +113,18 @@ module FlagpoleSitta
|
|
167
113
|
# this is because the new updated object for a sub class, could have also been in a cache for
|
168
114
|
# said sub class, but also in a cache for its super.
|
169
115
|
clazz = original_clazz
|
170
|
-
while(clazz.respond_to? :
|
116
|
+
while(clazz.respond_to? :destroy_array_cache)
|
171
117
|
|
172
118
|
#AR - Clear all caches related to the old route_id
|
173
|
-
clazz.
|
119
|
+
clazz.destroy_array_cache(self.try(:send, ("#{clazz.route_id}_was")).to_s)
|
174
120
|
#AR - Clear all caches related to the new route_id just in case
|
175
|
-
clazz.
|
121
|
+
clazz.destroy_array_cache(self.try(:send, ("#{clazz.route_id}")).to_s)
|
176
122
|
#AR - If the new and old are the same All that will happen on the second call is that
|
177
123
|
#it will write the flag out and then destroy it. A very tiny bit of work
|
178
124
|
#for a great amount of extra protection.
|
179
125
|
|
180
126
|
# AR - Remember to include models_in_index in your helper call in the corresponding index cache.
|
181
|
-
clazz.
|
127
|
+
clazz.destroy_array_cache
|
182
128
|
|
183
129
|
clazz = clazz.superclass
|
184
130
|
end
|