Skip to content

Instantly share code, notes, and snippets.

@stevenh512
Created March 29, 2012 04:46
Show Gist options
  • Save stevenh512/2233420 to your computer and use it in GitHub Desktop.
Save stevenh512/2233420 to your computer and use it in GitHub Desktop.
Patches for acts-as-taggable-on
From 5d61df52623fe0950cdcf99a831508bdd2dacb76 Mon Sep 17 00:00:00 2001
From: Raphael Sofaer <raphael@joindiaspora.com>
Date: Fri, 11 Mar 2011 13:28:53 -0800
Subject: [PATCH 1/4] Stop using LIKE to do case insensitivity, instead just
downcase everything on the way in. Tests now pass with
a utf8_bin collation in MYSQL
---
lib/acts_as_taggable_on/tag.rb | 21 +++++++++++++--------
spec/spec_helper.rb | 2 +-
2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/lib/acts_as_taggable_on/tag.rb b/lib/acts_as_taggable_on/tag.rb
index 907f2e6..2f7b011 100644
--- a/lib/acts_as_taggable_on/tag.rb
+++ b/lib/acts_as_taggable_on/tag.rb
@@ -20,24 +20,25 @@ module ActsAsTaggableOn
end
def self.named(name)
- where(["name #{like_operator} ?", name])
+ where(["name = ?", comparable_name(name)])
end
def self.named_any(list)
- where(list.map { |tag| sanitize_sql(["name #{like_operator} ?", tag.to_s]) }.join(" OR "))
+ where(list.map { |tag| sanitize_sql(["name = ?", comparable_name(tag.to_s)]) }.join(" OR "))
end
def self.named_like(name)
- where(["name #{like_operator} ?", "%#{name}%"])
+ where(["name #{like_operator} ?", "%#{comparable_name(name)}%"])
end
def self.named_like_any(list)
- where(list.map { |tag| sanitize_sql(["name #{like_operator} ?", "%#{tag.to_s}%"]) }.join(" OR "))
+ where(list.map { |tag| sanitize_sql(["name #{like_operator} ?", "%#{comparable_name(tag.to_s)}%"]) }.join(" OR "))
end
### CLASS METHODS:
def self.find_or_create_with_like_by_name(name)
+ name = comparable_name(name)
named_like(name).first || create(:name => name)
end
@@ -58,6 +59,10 @@ module ActsAsTaggableOn
### INSTANCE METHODS:
+ def name= new_name
+ write_attribute(:name, self.class.comparable_name(new_name))
+ end
+
def ==(object)
super || (object.is_a?(Tag) && name == object.name)
end
@@ -71,14 +76,14 @@ module ActsAsTaggableOn
end
class << self
+ def comparable_name(str)
+ RUBY_VERSION >= "1.9" ? str.downcase : str.mb_chars.downcase
+ end
+
private
def like_operator
using_postgresql? ? 'ILIKE' : 'LIKE'
end
-
- def comparable_name(str)
- RUBY_VERSION >= "1.9" ? str.downcase : str.mb_chars.downcase
- end
end
end
end
\ No newline at end of file
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 8300e7f..f170811 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -13,7 +13,7 @@ begin
Bundler.setup
rescue Bundler::GemNotFound
raise RuntimeError, "Bundler couldn't find some gems." +
- "Did you run \`bundlee install\`?"
+ "Did you run \`bundle install\`?"
end
Bundler.require
--
1.7.5.4
From 498089b41503af633f55bdc1d43b142e7d76e1f1 Mon Sep 17 00:00:00 2001
From: Raphael Sofaer <raphael@joindiaspora.com>
Date: Fri, 11 Mar 2011 13:43:16 -0800
Subject: [PATCH 2/4] Regenerate gemspec to supress warning
---
Gemfile | 4 +-
acts-as-taggable-on.gemspec | 129 ++++++++++++++++++++++++-------------------
2 files changed, 75 insertions(+), 58 deletions(-)
diff --git a/Gemfile b/Gemfile
index b37a795..e127fc1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,8 +1,8 @@
source :gemcutter
# Rails 3.0
-gem 'rails', '3.0.0.beta3'
-gem 'rspec', '2.0.0.beta.8'
+gem 'rails', '>= 3.0'
+gem 'rspec', '>= 2.0'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'mysql'
gem 'pg'
diff --git a/acts-as-taggable-on.gemspec b/acts-as-taggable-on.gemspec
index 226f39c..e063679 100644
--- a/acts-as-taggable-on.gemspec
+++ b/acts-as-taggable-on.gemspec
@@ -1,6 +1,6 @@
# Generated by jeweler
# DO NOT EDIT THIS FILE DIRECTLY
-# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
+# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Michael Bleigh"]
- s.date = %q{2010-05-19}
+ s.date = %q{2011-03-11}
s.description = %q{With ActsAsTaggableOn, you could tag a single model on several contexts, such as skills, interests, and awards. It also provides other advanced functionality.}
s.email = %q{michael@intridea.com}
s.extra_rdoc_files = [
@@ -17,74 +17,91 @@ Gem::Specification.new do |s|
]
s.files = [
"CHANGELOG",
- "Gemfile",
- "MIT-LICENSE",
- "README.rdoc",
- "Rakefile",
- "VERSION",
- "generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb",
- "generators/acts_as_taggable_on_migration/templates/migration.rb",
- "lib/acts-as-taggable-on.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on/core.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb",
- "lib/acts_as_taggable_on/acts_as_taggable_on/related.rb",
- "lib/acts_as_taggable_on/acts_as_tagger.rb",
- "lib/acts_as_taggable_on/compatibility/Gemfile",
- "lib/acts_as_taggable_on/compatibility/active_record_backports.rb",
- "lib/acts_as_taggable_on/compatibility/postgresql.rb",
- "lib/acts_as_taggable_on/tag.rb",
- "lib/acts_as_taggable_on/tag_list.rb",
- "lib/acts_as_taggable_on/tagging.rb",
- "lib/acts_as_taggable_on/tags_helper.rb",
- "lib/generators/acts_as_taggable_on/migration/migration_generator.rb",
- "lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb",
- "rails/init.rb",
- "spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb",
- "spec/acts_as_taggable_on/acts_as_tagger_spec.rb",
- "spec/acts_as_taggable_on/tag_list_spec.rb",
- "spec/acts_as_taggable_on/tag_spec.rb",
- "spec/acts_as_taggable_on/taggable_spec.rb",
- "spec/acts_as_taggable_on/tagger_spec.rb",
- "spec/acts_as_taggable_on/tagging_spec.rb",
- "spec/acts_as_taggable_on/tags_helper_spec.rb",
- "spec/bm.rb",
- "spec/database.yml",
- "spec/database.yml.sample",
- "spec/models.rb",
- "spec/schema.rb",
- "spec/spec_helper.rb"
+ "Gemfile",
+ "MIT-LICENSE",
+ "README.rdoc",
+ "Rakefile",
+ "VERSION",
+ "generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb",
+ "generators/acts_as_taggable_on_migration/templates/migration.rb",
+ "lib/acts-as-taggable-on.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on/core.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb",
+ "lib/acts_as_taggable_on/acts_as_taggable_on/related.rb",
+ "lib/acts_as_taggable_on/acts_as_tagger.rb",
+ "lib/acts_as_taggable_on/compatibility/Gemfile",
+ "lib/acts_as_taggable_on/compatibility/active_record_backports.rb",
+ "lib/acts_as_taggable_on/tag.rb",
+ "lib/acts_as_taggable_on/tag_list.rb",
+ "lib/acts_as_taggable_on/tagging.rb",
+ "lib/acts_as_taggable_on/tags_helper.rb",
+ "lib/generators/acts_as_taggable_on/migration/migration_generator.rb",
+ "lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb",
+ "rails/init.rb",
+ "spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb",
+ "spec/acts_as_taggable_on/acts_as_tagger_spec.rb",
+ "spec/acts_as_taggable_on/tag_list_spec.rb",
+ "spec/acts_as_taggable_on/tag_spec.rb",
+ "spec/acts_as_taggable_on/taggable_spec.rb",
+ "spec/acts_as_taggable_on/tagger_spec.rb",
+ "spec/acts_as_taggable_on/tagging_spec.rb",
+ "spec/acts_as_taggable_on/tags_helper_spec.rb",
+ "spec/bm.rb",
+ "spec/database.yml.sample",
+ "spec/models.rb",
+ "spec/schema.rb",
+ "spec/spec_helper.rb"
]
s.homepage = %q{http://github.com/mbleigh/acts-as-taggable-on}
- s.rdoc_options = ["--charset=UTF-8"]
s.require_paths = ["lib"]
- s.rubygems_version = %q{1.3.6}
+ s.rubygems_version = %q{1.5.3}
s.summary = %q{ActsAsTaggableOn is a tagging plugin for Rails that provides multiple tagging contexts on a single model.}
s.test_files = [
"spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb",
- "spec/acts_as_taggable_on/acts_as_tagger_spec.rb",
- "spec/acts_as_taggable_on/tag_list_spec.rb",
- "spec/acts_as_taggable_on/tag_spec.rb",
- "spec/acts_as_taggable_on/taggable_spec.rb",
- "spec/acts_as_taggable_on/tagger_spec.rb",
- "spec/acts_as_taggable_on/tagging_spec.rb",
- "spec/acts_as_taggable_on/tags_helper_spec.rb",
- "spec/bm.rb",
- "spec/models.rb",
- "spec/schema.rb",
- "spec/spec_helper.rb"
+ "spec/acts_as_taggable_on/acts_as_tagger_spec.rb",
+ "spec/acts_as_taggable_on/tag_list_spec.rb",
+ "spec/acts_as_taggable_on/tag_spec.rb",
+ "spec/acts_as_taggable_on/taggable_spec.rb",
+ "spec/acts_as_taggable_on/tagger_spec.rb",
+ "spec/acts_as_taggable_on/tagging_spec.rb",
+ "spec/acts_as_taggable_on/tags_helper_spec.rb",
+ "spec/bm.rb",
+ "spec/models.rb",
+ "spec/schema.rb",
+ "spec/spec_helper.rb"
]
if s.respond_to? :specification_version then
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+ s.add_runtime_dependency(%q<rails>, [">= 3.0"])
+ s.add_runtime_dependency(%q<rspec>, [">= 2.0"])
+ s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
+ s.add_runtime_dependency(%q<mysql>, [">= 0"])
+ s.add_runtime_dependency(%q<pg>, [">= 0"])
+ s.add_runtime_dependency(%q<jeweler>, [">= 0"])
+ s.add_runtime_dependency(%q<rcov>, [">= 0"])
else
+ s.add_dependency(%q<rails>, [">= 3.0"])
+ s.add_dependency(%q<rspec>, [">= 2.0"])
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
+ s.add_dependency(%q<mysql>, [">= 0"])
+ s.add_dependency(%q<pg>, [">= 0"])
+ s.add_dependency(%q<jeweler>, [">= 0"])
+ s.add_dependency(%q<rcov>, [">= 0"])
end
else
+ s.add_dependency(%q<rails>, [">= 3.0"])
+ s.add_dependency(%q<rspec>, [">= 2.0"])
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
+ s.add_dependency(%q<mysql>, [">= 0"])
+ s.add_dependency(%q<pg>, [">= 0"])
+ s.add_dependency(%q<jeweler>, [">= 0"])
+ s.add_dependency(%q<rcov>, [">= 0"])
end
end
--
1.7.5.4
From 5f3a16aef0e27cd89f492944f709afbef2ed0443 Mon Sep 17 00:00:00 2001
From: Raphael Sofaer <raphael@joindiaspora.com>
Date: Fri, 11 Mar 2011 14:41:38 -0800
Subject: [PATCH 3/4] get rid of gem deps in gemspec
---
acts-as-taggable-on.gemspec | 18 ------------------
1 files changed, 0 insertions(+), 18 deletions(-)
diff --git a/acts-as-taggable-on.gemspec b/acts-as-taggable-on.gemspec
index e063679..2820c31 100644
--- a/acts-as-taggable-on.gemspec
+++ b/acts-as-taggable-on.gemspec
@@ -79,29 +79,11 @@ Gem::Specification.new do |s|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rails>, [">= 3.0"])
- s.add_runtime_dependency(%q<rspec>, [">= 2.0"])
- s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
- s.add_runtime_dependency(%q<mysql>, [">= 0"])
- s.add_runtime_dependency(%q<pg>, [">= 0"])
- s.add_runtime_dependency(%q<jeweler>, [">= 0"])
- s.add_runtime_dependency(%q<rcov>, [">= 0"])
else
s.add_dependency(%q<rails>, [">= 3.0"])
- s.add_dependency(%q<rspec>, [">= 2.0"])
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
- s.add_dependency(%q<mysql>, [">= 0"])
- s.add_dependency(%q<pg>, [">= 0"])
- s.add_dependency(%q<jeweler>, [">= 0"])
- s.add_dependency(%q<rcov>, [">= 0"])
end
else
s.add_dependency(%q<rails>, [">= 3.0"])
- s.add_dependency(%q<rspec>, [">= 2.0"])
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
- s.add_dependency(%q<mysql>, [">= 0"])
- s.add_dependency(%q<pg>, [">= 0"])
- s.add_dependency(%q<jeweler>, [">= 0"])
- s.add_dependency(%q<rcov>, [">= 0"])
end
end
--
1.7.5.4
From c3592fe1a906f6ff1cd12766c5cf1152c51eec40 Mon Sep 17 00:00:00 2001
From: Raphael Sofaer <raphael@joindiaspora.com>
Date: Fri, 11 Mar 2011 15:06:57 -0800
Subject: [PATCH 4/4] downcase query input in tagged_with method
---
.../acts_as_taggable_on/core.rb | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb b/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
index 98b42b2..4524724 100644
--- a/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
+++ b/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
@@ -76,11 +76,11 @@ module ActsAsTaggableOn::Taggable
context = options.delete(:on)
if options.delete(:exclude)
- tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?", t]) }.join(" OR ")
+ tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?", ActsAsTaggableOn::Tag.comparable_name(t)]) }.join(" OR ")
conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{ActsAsTaggableOn::Tagging.table_name}.taggable_id FROM #{ActsAsTaggableOn::Tagging.table_name} JOIN #{ActsAsTaggableOn::Tag.table_name} ON #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND (#{tags_conditions}) WHERE #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})"
elsif options.delete(:any)
- tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?", t]) }.join(" OR ")
+ tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?", ActsAsTaggableOn::Tag.comparable_name(t)]) }.join(" OR ")
conditions << "#{table_name}.#{primary_key} IN (SELECT #{ActsAsTaggableOn::Tagging.table_name}.taggable_id FROM #{ActsAsTaggableOn::Tagging.table_name} JOIN #{ActsAsTaggableOn::Tag.table_name} ON #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND (#{tags_conditions}) WHERE #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})"
else
--
1.7.5.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment