tagtools 0.0.1 → 0.0.2
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/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
|