Created
March 29, 2012 04:46
-
-
Save stevenh512/2233420 to your computer and use it in GitHub Desktop.
Patches for acts-as-taggable-on
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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