rocket_tag 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/README.md +7 -0
- data/VERSION +1 -1
- data/lib/rocket_tag/taggable.rb +61 -64
- data/rocket_tag.gemspec +2 -2
- data/spec/rocket_tag/taggable_spec.rb +5 -0
- metadata +3 -3
data/README.md
CHANGED
@@ -67,6 +67,13 @@ of 'tags_count'
|
|
67
67
|
model.tagged_similar :on => "skills"
|
68
68
|
model.tagged_similar :on => "habits"
|
69
69
|
|
70
|
+
The two cases of tagged_similar below are functionally identical because there are
|
71
|
+
only two contexts specified on the class. If there were three or more contexts specified
|
72
|
+
then the two below would not be identical.
|
73
|
+
|
74
|
+
model.tagged_similar :on => ["skills", "habits"]
|
75
|
+
model.tagged_similar
|
76
|
+
|
70
77
|
Find similar models based on tags on every context and return in decending order
|
71
78
|
of 'tags_count'. Note that each tag is still scoped according to it's context
|
72
79
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.3
|
data/lib/rocket_tag/taggable.rb
CHANGED
@@ -108,39 +108,24 @@ module RocketTag
|
|
108
108
|
@contexts[context.to_sym] = list
|
109
109
|
end
|
110
110
|
|
111
|
-
def
|
111
|
+
def tags_for_context context
|
112
112
|
@contexts ||= {}
|
113
113
|
@contexts[context.to_sym] || []
|
114
114
|
end
|
115
115
|
|
116
|
-
|
117
116
|
def tagged_similar options = {}
|
118
117
|
context = options.delete :on
|
119
|
-
if context
|
120
|
-
raise Exception.new("#{context} is not a valid tag context for #{self.class}") unless self.class.rocket_tag.contexts.include? context
|
121
|
-
end
|
122
|
-
if context
|
123
|
-
contexts = [context]
|
124
|
-
else
|
125
|
-
contexts = self.class.rocket_tag.contexts
|
126
|
-
end
|
127
|
-
|
128
|
-
if contexts.size > 1
|
129
|
-
contexts = contexts.delete :tag
|
130
|
-
end
|
131
118
|
|
132
|
-
contexts =
|
133
|
-
send(c.to_sym).size == 0
|
134
|
-
end
|
119
|
+
contexts = self.class.normalize_contexts(context, self.class.rocket_tag.contexts)
|
135
120
|
|
136
|
-
|
137
|
-
|
121
|
+
condition = contexts.reject do |c|
|
122
|
+
tags_for_context(c).size == 0
|
123
|
+
end.map do |context|
|
138
124
|
self.class.squeel do
|
139
|
-
|
125
|
+
tags.name.in(my{tags_for_context(context)}) &
|
126
|
+
(taggings.context == context.to_s)
|
140
127
|
end
|
141
|
-
end
|
142
|
-
|
143
|
-
condition = conditions.inject do |s, t|
|
128
|
+
end.inject do |s, t|
|
144
129
|
s | t
|
145
130
|
end
|
146
131
|
|
@@ -168,7 +153,13 @@ module RocketTag
|
|
168
153
|
# the relation instead of passing the rel parameter in
|
169
154
|
# however my tests fails with wrong counts. This is
|
170
155
|
# not so elegant
|
171
|
-
|
156
|
+
#
|
157
|
+
# rel can be passed as the last expression in a block
|
158
|
+
# if desired.
|
159
|
+
def count_tags(rel=nil)
|
160
|
+
if block_given?
|
161
|
+
rel = yield
|
162
|
+
end
|
172
163
|
rel.select('*').
|
173
164
|
select{count(~id).as(tags_count)}.
|
174
165
|
group_by_all_columns.
|
@@ -176,36 +167,54 @@ module RocketTag
|
|
176
167
|
isolate_group_by_as(self)
|
177
168
|
end
|
178
169
|
|
170
|
+
def is_valid_context? context
|
171
|
+
rocket_tag.contexts.include? context
|
172
|
+
end
|
173
|
+
|
174
|
+
def normalize_contexts(context, default_if_nil = [])
|
175
|
+
contexts = if context
|
176
|
+
if context.class == Array
|
177
|
+
context
|
178
|
+
else
|
179
|
+
[context]
|
180
|
+
end
|
181
|
+
else
|
182
|
+
default_if_nil
|
183
|
+
end
|
184
|
+
|
185
|
+
validate_contexts(contexts)
|
186
|
+
|
187
|
+
contexts
|
188
|
+
end
|
189
|
+
|
190
|
+
# Verify contexts are valid for the taggable type
|
191
|
+
def validate_contexts contexts
|
192
|
+
contexts.each do |context|
|
193
|
+
unless self.is_valid_context? context
|
194
|
+
raise Exception.new("#{context} is not a valid tag context for #{self}")
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
179
199
|
# Filters tags according to
|
180
200
|
# context. context param can
|
181
201
|
# be either a single context
|
182
202
|
# id or an array of context ids
|
183
203
|
def with_tag_context context
|
184
|
-
|
185
|
-
if context
|
186
|
-
if context.class == Array
|
187
|
-
contexts = context
|
188
|
-
else
|
189
|
-
contexts = [context]
|
190
|
-
end
|
191
|
-
else
|
192
|
-
contexts = []
|
193
|
-
end
|
204
|
+
contexts = normalize_contexts(context)
|
194
205
|
|
195
|
-
|
206
|
+
condition = if contexts
|
207
|
+
|
208
|
+
contexts.map do |context|
|
196
209
|
squeel do
|
197
210
|
(taggings.context == context.to_s)
|
198
211
|
end
|
199
|
-
end
|
200
|
-
|
201
|
-
condition = conditions.inject do |s, t|
|
212
|
+
end.inject do |s, t|
|
202
213
|
s | t
|
203
214
|
end
|
204
215
|
|
205
|
-
where{condition}
|
206
|
-
else
|
207
|
-
where{ }
|
208
216
|
end
|
217
|
+
|
209
218
|
end
|
210
219
|
|
211
220
|
|
@@ -224,23 +233,16 @@ module RocketTag
|
|
224
233
|
# along with an extra column :tags_count.
|
225
234
|
def tagged_with tags_list, options = {}
|
226
235
|
|
227
|
-
r =
|
236
|
+
r = count_tags do
|
237
|
+
joins{tags}.
|
228
238
|
where{tags.name.in(tags_list)}.
|
229
|
-
with_tag_context(options.delete
|
230
|
-
|
231
|
-
|
232
|
-
r = count_tags(r)
|
239
|
+
where(with_tag_context(options.delete(:on)))
|
240
|
+
end
|
233
241
|
|
234
242
|
if options.delete :all
|
235
|
-
r
|
243
|
+
r.where{tags_count==tags_list.length}
|
236
244
|
elsif min = options.delete(:min)
|
237
|
-
r
|
238
|
-
end
|
239
|
-
|
240
|
-
if options.delete :sifter
|
241
|
-
squeel do
|
242
|
-
id.in(r.select{"id"})
|
243
|
-
end
|
245
|
+
r.where{tags_count>=min}
|
244
246
|
else
|
245
247
|
r
|
246
248
|
end
|
@@ -251,13 +253,12 @@ module RocketTag
|
|
251
253
|
# for given model with an extra column :tags_count.
|
252
254
|
def popular_tags options={}
|
253
255
|
|
254
|
-
r =
|
255
|
-
|
256
|
+
r = count_tags do
|
257
|
+
RocketTag::Tag.
|
256
258
|
joins{taggings}.
|
257
|
-
with_tag_context(options.delete
|
259
|
+
where(with_tag_context(options.delete(:on))).
|
258
260
|
by_taggable_type(self)
|
259
|
-
|
260
|
-
r = count_tags(r)
|
261
|
+
end
|
261
262
|
|
262
263
|
if min = options.delete(:min)
|
263
264
|
r = r.where{tags_count>=min}
|
@@ -320,10 +321,6 @@ module RocketTag
|
|
320
321
|
alias_method_chain :reload, :tags
|
321
322
|
end
|
322
323
|
|
323
|
-
if contexts.blank?
|
324
|
-
contexts = [:tag]
|
325
|
-
end
|
326
|
-
|
327
324
|
rocket_tag.contexts += contexts
|
328
325
|
|
329
326
|
setup_for_rocket_tag
|
@@ -352,7 +349,7 @@ module RocketTag
|
|
352
349
|
# Return an array of RocketTag::Tags for the context
|
353
350
|
define_method "#{context}" do
|
354
351
|
cache_tags
|
355
|
-
|
352
|
+
tags_for_context(context)
|
356
353
|
end
|
357
354
|
|
358
355
|
|
data/rocket_tag.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rocket_tag"
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Brad Phelan"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-07-02"
|
13
13
|
s.description = ""
|
14
14
|
s.email = "bradphelan@xtargets.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -174,6 +174,11 @@ describe TaggableModel do
|
|
174
174
|
it "should return similar items" do
|
175
175
|
@t00.tagged_similar(:on => :skills).count.should == 3
|
176
176
|
@t00.tagged_similar(:on => :languages).count.should == 3
|
177
|
+
|
178
|
+
@t00.tagged_similar(:on => [:languages, :skills]).count.should == 4
|
179
|
+
|
180
|
+
# Effectively similar to specifying all the contexts in
|
181
|
+
# the on clause
|
177
182
|
@t00.tagged_similar.count.should == 4
|
178
183
|
end
|
179
184
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rocket_tag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.5.
|
5
|
+
version: 0.5.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Brad Phelan
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-07-02 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -144,7 +144,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
144
|
requirements:
|
145
145
|
- - ">="
|
146
146
|
- !ruby/object:Gem::Version
|
147
|
-
hash:
|
147
|
+
hash: 293230795738832648
|
148
148
|
segments:
|
149
149
|
- 0
|
150
150
|
version: "0"
|