tagtools 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/README +2 -4
- data/lib/tagtools.rb +49 -83
- data/rakefile +1 -1
- data/test/global_tags_test.rb +42 -0
- data/test/user_tags_test.rb +48 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -28,13 +28,11 @@ schema.
|
|
28
28
|
slashdot_bookmark.user_tags(current_user.id).concat( "geeky", "news", "technology" )
|
29
29
|
slashdot_bookmark.tags
|
30
30
|
=> [ tag:"geeky", tag:"news", tag:"technology" ]
|
31
|
-
slashdot_bookmark.user_tags(current_user).delete( "news" )
|
31
|
+
slashdot_bookmark.user_tags(current_user.id).delete( "news" )
|
32
32
|
slashdot_bookmark.tags
|
33
33
|
=> [ tag:"geeky", tag:"technology" ]
|
34
|
-
slashdot_bookmark.user_tags(current_user).concat( "technology", "linux" )
|
34
|
+
slashdot_bookmark.user_tags(current_user.id).concat( "technology", "linux" )
|
35
35
|
slashdot_bookmark.tags
|
36
36
|
=> [ tag:"geeky", tag:"technology", tag:"linux" ]
|
37
|
-
Bookmark.tag_query( :user_id => current_user, :with_any_tags => ["linux"] )
|
38
|
-
=> []
|
39
37
|
Bookmark.tag_query( :with_any_tags => ["linux"] )
|
40
38
|
=> [ #<Bookmark:0x77dc54 @attributes={"url"=>"http://slashdot.org"}> ]
|
data/lib/tagtools.rb
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
TAG_TOOLS_VERSION = "0.0.
|
24
|
+
TAG_TOOLS_VERSION = "0.0.2"
|
25
25
|
|
26
26
|
$:.unshift(File.dirname(__FILE__))
|
27
27
|
$:.unshift(File.dirname(__FILE__) + "/../../activerecord/lib")
|
@@ -122,6 +122,12 @@ module ActiveRecord #:nodoc:
|
|
122
122
|
|
123
123
|
alias :concat_with_attributes :push_with_attributes
|
124
124
|
|
125
|
+
def include?(raw_tag)
|
126
|
+
actual_tag = get_tag(raw_tag)
|
127
|
+
return false if actual_tag.nil?
|
128
|
+
return @target.include?(actual_tag)
|
129
|
+
end
|
130
|
+
|
125
131
|
def size
|
126
132
|
count_records
|
127
133
|
end
|
@@ -132,6 +138,7 @@ module ActiveRecord #:nodoc:
|
|
132
138
|
@owner.transaction do
|
133
139
|
flatten_deeper(records).each do |record|
|
134
140
|
record = create_tag(record)
|
141
|
+
next if self.include?(record)
|
135
142
|
callback(:before_add, record)
|
136
143
|
result &&= insert_record(record) unless @owner.new_record?
|
137
144
|
@target << record
|
@@ -152,7 +159,13 @@ module ActiveRecord #:nodoc:
|
|
152
159
|
records[index] = create_tag(records[index])
|
153
160
|
end
|
154
161
|
records.reject! do |record|
|
155
|
-
|
162
|
+
if record.nil?
|
163
|
+
true
|
164
|
+
elsif record.new_record?
|
165
|
+
@target.delete(record)
|
166
|
+
else
|
167
|
+
false
|
168
|
+
end
|
156
169
|
end
|
157
170
|
return if records.empty?
|
158
171
|
|
@@ -168,6 +181,7 @@ module ActiveRecord #:nodoc:
|
|
168
181
|
|
169
182
|
protected
|
170
183
|
def create_tag(raw_tag)
|
184
|
+
return nil if raw_tag.nil?
|
171
185
|
if raw_tag.kind_of? @tag_class
|
172
186
|
return raw_tag
|
173
187
|
end
|
@@ -180,6 +194,15 @@ module ActiveRecord #:nodoc:
|
|
180
194
|
return tag_object
|
181
195
|
end
|
182
196
|
|
197
|
+
def get_tag(raw_tag)
|
198
|
+
return nil if raw_tag.nil?
|
199
|
+
if raw_tag.kind_of? @tag_class
|
200
|
+
return raw_tag
|
201
|
+
end
|
202
|
+
tag_object = @tag_class.find_by_name(raw_tag.to_s)
|
203
|
+
return tag_object
|
204
|
+
end
|
205
|
+
|
183
206
|
def find_target(sql = @finder_sql)
|
184
207
|
records = @tag_class.find_by_sql(sql)
|
185
208
|
uniq(records)
|
@@ -235,18 +258,31 @@ module ActiveRecord #:nodoc:
|
|
235
258
|
end
|
236
259
|
|
237
260
|
def construct_sql
|
238
|
-
@
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
261
|
+
if @user_id.nil?
|
262
|
+
@finder_sql =
|
263
|
+
"SELECT t.*, j.* FROM #{@join_table} j, " +
|
264
|
+
" #{@tag_class.table_name} t " +
|
265
|
+
"WHERE t.#{@tag_class.primary_key} = " +
|
266
|
+
" j.#{@tag_foreign_key} " +
|
267
|
+
"AND j.#{@item_foreign_key} = " +
|
268
|
+
" #{@owner.quoted_id} " +
|
269
|
+
"ORDER BY t.name"
|
270
|
+
else
|
271
|
+
@finder_sql =
|
272
|
+
"SELECT t.*, j.* FROM #{@join_table} j, " +
|
273
|
+
" #{@tag_class.table_name} t " +
|
274
|
+
"WHERE t.#{@tag_class.primary_key} = " +
|
275
|
+
" j.#{@tag_foreign_key} " +
|
276
|
+
"AND j.#{@item_foreign_key} = " +
|
277
|
+
" #{@owner.quoted_id} " +
|
278
|
+
"AND j.#{@user_foreign_key} = " +
|
279
|
+
" '#{@user_id}' " +
|
280
|
+
"ORDER BY t.name"
|
281
|
+
end
|
246
282
|
end
|
247
283
|
end
|
248
284
|
|
249
|
-
class UserTagsAssociation <
|
285
|
+
class UserTagsAssociation < GlobalTagsAssociation #:nodoc:
|
250
286
|
def initialize(owner, user_id, tag_class, user_class, item_class,
|
251
287
|
options)
|
252
288
|
@owner = owner
|
@@ -358,16 +394,13 @@ module ActiveRecord #:nodoc:
|
|
358
394
|
|
359
395
|
alias :concat_with_attributes :push_with_attributes
|
360
396
|
|
361
|
-
def size
|
362
|
-
count_records
|
363
|
-
end
|
364
|
-
|
365
397
|
def <<(*records)
|
366
398
|
result = true
|
367
399
|
load_target
|
368
400
|
@owner.transaction do
|
369
401
|
flatten_deeper(records).each do |record|
|
370
402
|
record = create_tag(record)
|
403
|
+
next if self.include?(record)
|
371
404
|
callback(:before_add, record)
|
372
405
|
result &&= insert_record(record) unless @owner.new_record?
|
373
406
|
@target << record
|
@@ -382,50 +415,7 @@ module ActiveRecord #:nodoc:
|
|
382
415
|
alias_method :push, :<<
|
383
416
|
alias_method :concat, :<<
|
384
417
|
|
385
|
-
# Remove +records+ from this association. Does not destroy +records+.
|
386
|
-
def delete(*records)
|
387
|
-
records = flatten_deeper(records)
|
388
|
-
for index in 0..records.size
|
389
|
-
records[index] = create_tag(records[index])
|
390
|
-
end
|
391
|
-
records.reject! do |record|
|
392
|
-
@target.delete(record) if record.new_record?
|
393
|
-
end
|
394
|
-
return if records.empty?
|
395
|
-
|
396
|
-
@owner.transaction do
|
397
|
-
records.each { |record| callback(:before_remove, record) }
|
398
|
-
delete_records(records)
|
399
|
-
records.each do |record|
|
400
|
-
@target.delete(record)
|
401
|
-
callback(:after_remove, record)
|
402
|
-
end
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
418
|
protected
|
407
|
-
def create_tag(raw_tag)
|
408
|
-
if raw_tag.kind_of? @tag_class
|
409
|
-
return raw_tag
|
410
|
-
end
|
411
|
-
tag_object = @tag_class.find_by_name(raw_tag.to_s)
|
412
|
-
if tag_object.nil?
|
413
|
-
tag_object = @tag_class.new
|
414
|
-
tag_object.name = raw_tag.to_s
|
415
|
-
tag_object.save
|
416
|
-
end
|
417
|
-
return tag_object
|
418
|
-
end
|
419
|
-
|
420
|
-
def find_target(sql = @finder_sql)
|
421
|
-
records = @tag_class.find_by_sql(sql)
|
422
|
-
uniq(records)
|
423
|
-
end
|
424
|
-
|
425
|
-
def count_records
|
426
|
-
load_target.size
|
427
|
-
end
|
428
|
-
|
429
419
|
def insert_record(record, join_attributes = {})
|
430
420
|
if @user_id.nil?
|
431
421
|
raise "Cannot insert record if the user id is not set."
|
@@ -476,34 +466,10 @@ module ActiveRecord #:nodoc:
|
|
476
466
|
sql = "DELETE FROM #{@join_table} " +
|
477
467
|
"WHERE #{@item_foreign_key} = " +
|
478
468
|
" #{@owner.quoted_id} " +
|
479
|
-
"AND #{@user_foreign_key} = '#{@user_id.to_s}'"
|
469
|
+
"AND #{@user_foreign_key} = '#{@user_id.to_s}'" +
|
480
470
|
"AND #{@tag_foreign_key} IN (#{ids})"
|
481
471
|
@owner.connection.execute(sql)
|
482
472
|
end
|
483
|
-
|
484
|
-
def construct_sql
|
485
|
-
if @user_id.nil?
|
486
|
-
@finder_sql =
|
487
|
-
"SELECT t.*, j.* FROM #{@join_table} j, " +
|
488
|
-
" #{@tag_class.table_name} t " +
|
489
|
-
"WHERE t.#{@tag_class.primary_key} = " +
|
490
|
-
" j.#{@tag_foreign_key} " +
|
491
|
-
"AND j.#{@item_foreign_key} = " +
|
492
|
-
" #{@owner.quoted_id} " +
|
493
|
-
"ORDER BY t.name"
|
494
|
-
else
|
495
|
-
@finder_sql =
|
496
|
-
"SELECT t.*, j.* FROM #{@join_table} j, " +
|
497
|
-
" #{@tag_class.table_name} t " +
|
498
|
-
"WHERE t.#{@tag_class.primary_key} = " +
|
499
|
-
" j.#{@tag_foreign_key} " +
|
500
|
-
"AND j.#{@item_foreign_key} = " +
|
501
|
-
" #{@owner.quoted_id} " +
|
502
|
-
"AND j.#{@user_foreign_key} = " +
|
503
|
-
" '#{@user_id}' " +
|
504
|
-
"ORDER BY t.name"
|
505
|
-
end
|
506
|
-
end
|
507
473
|
end
|
508
474
|
end
|
509
475
|
|
data/rakefile
CHANGED
data/test/global_tags_test.rb
CHANGED
@@ -100,4 +100,46 @@ class GlobalTagsTest < Test::Unit::TestCase
|
|
100
100
|
assert_equal(ruby_on_rails, results.first)
|
101
101
|
assert(!results.include?(red_handed))
|
102
102
|
end
|
103
|
+
|
104
|
+
def test_include
|
105
|
+
ruby_on_rails = Image.new
|
106
|
+
ruby_on_rails.url = "http://www.rubyonrails.com/logo.gif"
|
107
|
+
ruby_on_rails.save
|
108
|
+
ruby_on_rails.tags << "ruby"
|
109
|
+
ruby_on_rails.tags << "rails"
|
110
|
+
ruby_on_rails.tags << "framework"
|
111
|
+
assert_equal(true,
|
112
|
+
ruby_on_rails.tags(true).include?("rails"))
|
113
|
+
assert_equal(false,
|
114
|
+
ruby_on_rails.tags(true).include?("notpresent"))
|
115
|
+
assert_equal(true,
|
116
|
+
ruby_on_rails.tags(true).include?(
|
117
|
+
Tag.find_by_name("framework")))
|
118
|
+
assert_equal(false,
|
119
|
+
ruby_on_rails.tags(true).include?(
|
120
|
+
Tag.find_by_name("alsonotpresent")))
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_size
|
124
|
+
ruby_on_rails = Image.new
|
125
|
+
ruby_on_rails.url = "http://www.rubyonrails.com/logo.gif"
|
126
|
+
ruby_on_rails.save
|
127
|
+
ruby_on_rails.tags << "ruby"
|
128
|
+
ruby_on_rails.tags << "rails"
|
129
|
+
ruby_on_rails.tags << "framework"
|
130
|
+
assert_equal(3,
|
131
|
+
ruby_on_rails.tags(true).size)
|
132
|
+
ruby_on_rails.tags(true) << "rails"
|
133
|
+
assert_equal(3,
|
134
|
+
ruby_on_rails.tags(true).size)
|
135
|
+
ruby_on_rails.tags << "web"
|
136
|
+
assert_equal(4,
|
137
|
+
ruby_on_rails.tags(true).size)
|
138
|
+
ruby_on_rails.tags.delete("framework")
|
139
|
+
assert_equal(3,
|
140
|
+
ruby_on_rails.tags.size)
|
141
|
+
ruby_on_rails.tags.delete("ruby")
|
142
|
+
assert_equal(2,
|
143
|
+
ruby_on_rails.tags(true).size)
|
144
|
+
end
|
103
145
|
end
|
data/test/user_tags_test.rb
CHANGED
@@ -113,4 +113,52 @@ class UserTagsTest < Test::Unit::TestCase
|
|
113
113
|
assert_equal(ruby_on_rails, results.first)
|
114
114
|
assert(!results.include?(red_handed))
|
115
115
|
end
|
116
|
+
|
117
|
+
def test_include
|
118
|
+
some_guy = User.new
|
119
|
+
some_guy.name = "Joe Normal"
|
120
|
+
some_guy.save
|
121
|
+
ruby_on_rails = Bookmark.new
|
122
|
+
ruby_on_rails.url = "http://www.rubyonrails.com"
|
123
|
+
ruby_on_rails.save
|
124
|
+
ruby_on_rails.user_tags(some_guy.id) << "ruby"
|
125
|
+
ruby_on_rails.user_tags(some_guy.id) << "rails"
|
126
|
+
ruby_on_rails.user_tags(some_guy.id) << "framework"
|
127
|
+
assert_equal(true,
|
128
|
+
ruby_on_rails.user_tags(some_guy.id, true).include?("rails"))
|
129
|
+
assert_equal(false,
|
130
|
+
ruby_on_rails.user_tags(some_guy.id, true).include?("notpresent"))
|
131
|
+
assert_equal(true,
|
132
|
+
ruby_on_rails.user_tags(some_guy.id, true).include?(
|
133
|
+
Tag.find_by_name("framework")))
|
134
|
+
assert_equal(false,
|
135
|
+
ruby_on_rails.user_tags(some_guy.id, true).include?(
|
136
|
+
Tag.find_by_name("alsonotpresent")))
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_size
|
140
|
+
some_guy = User.new
|
141
|
+
some_guy.name = "Joe Normal"
|
142
|
+
some_guy.save
|
143
|
+
ruby_on_rails = Bookmark.new
|
144
|
+
ruby_on_rails.url = "http://www.rubyonrails.com"
|
145
|
+
ruby_on_rails.save
|
146
|
+
ruby_on_rails.user_tags(some_guy.id) << "ruby"
|
147
|
+
ruby_on_rails.user_tags(some_guy.id) << "rails"
|
148
|
+
ruby_on_rails.user_tags(some_guy.id) << "framework"
|
149
|
+
assert_equal(3,
|
150
|
+
ruby_on_rails.user_tags(some_guy.id, true).size)
|
151
|
+
ruby_on_rails.user_tags(some_guy.id, true) << "rails"
|
152
|
+
assert_equal(3,
|
153
|
+
ruby_on_rails.user_tags(some_guy.id, true).size)
|
154
|
+
ruby_on_rails.user_tags(some_guy.id) << "web"
|
155
|
+
assert_equal(4,
|
156
|
+
ruby_on_rails.user_tags(some_guy.id, true).size)
|
157
|
+
ruby_on_rails.user_tags(some_guy.id).delete("framework")
|
158
|
+
assert_equal(3,
|
159
|
+
ruby_on_rails.user_tags(some_guy.id).size)
|
160
|
+
ruby_on_rails.user_tags(some_guy.id).delete("ruby")
|
161
|
+
assert_equal(2,
|
162
|
+
ruby_on_rails.user_tags(some_guy.id, true).size)
|
163
|
+
end
|
116
164
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: tagtools
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2005-09-09 00:00:00 -04:00
|
8
8
|
summary: Folksonomy system for Rails.
|
9
9
|
require_paths:
|
10
10
|
- lib
|