tests for tagging, eliminate dupes, script to unify tags

This commit is contained in:
Kyle Drake 2014-09-16 00:38:49 -07:00
parent 5cb988b3e7
commit f5814226a6
3 changed files with 68 additions and 1 deletions

View file

@ -123,4 +123,49 @@ task :primenewstriperunonlyonce => [:environment] do
site.plan_type = 'supporter'
site.save_changes validate: false
end
end
desc 'Clean tags'
task :cleantags => [:environment] do
Site.select(:id).all.each do |site|
site.tags.each do |tag|
if tag.name == ''
site.remove_tag tag
end
end
site.reload
if site.tags.length > 5
site.tags.slice(5, site.tags.length).each {|tag| site.remove_tag tag}
end
end
Tag.where(name: '').delete
Tag.all.each do |tag|
if tag.name.length > Tag::NAME_LENGTH_MAX
tag.sites.each { |site| tag.remove_site site }
tag.delete
end
tag.update name: tag.name.downcase.strip
end
Tag.all.each do |tag|
begin
tag.reload
rescue Sequel::Error => e
next if e.message =~ /Record not found/
end
matching_tags = Tag.exclude(id: tag.id).where(name: tag.name).all
matching_tags.each do |matching_tag|
DB[:sites_tags].where(tag_id: matching_tag.id).update(tag_id: tag.id)
matching_tag.delete
end
end
end

View file

@ -6,10 +6,13 @@ class Tag < Sequel::Model
def before_create
super
values[:name].downcase!
values[:name].strip!
end
def self.create_unless_exists(name)
dataset.filter(name: name.downcase).first || create(name: name)
name = name.downcase.strip
return nil if name == '' || name.nil?
dataset.filter(name: name).first || create(name: name)
end
def self.suggestions(name, limit=3)

View file

@ -9,5 +9,24 @@ describe Tag do
Tag.create_unless_exists tag_name.upcase
Tag.filter(name: tag_name).count.must_equal 1
end
it 'prohibits junk tags' do
Tag.where(name: '').delete
tag = Tag.create_unless_exists ''
Tag.where(name: '').count.must_equal 0
end
it 'strips tags' do
name = SecureRandom.hex(4)+' '
Tag.create_unless_exists name
Tag[name: name.strip].wont_be_nil
end
it 'does not duplicate' do
name = SecureRandom.hex(4).upcase
2.times { Tag.create_unless_exists name }
Tag.where(name: name.downcase).count.must_equal 1
end
end
end