Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 10 additions & 13 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
source "http://rubygems.org"
# Add dependencies required to use your gem here.
# Example:
# gem "activesupport", ">= 2.3.5"
gem "activerecord", ">= 3.2.0"
gem "squeel", '~> 1.0.11', :require => false
source 'https://rubygems.org'

gem 'activerecord', '>= 3.2.0'
gem 'squeel', '~> 1.1.1', :require => false

# Add dependencies to develop your gem here.
# Include everything needed to run rake, tests, features, etc.
group :development do
gem "pg"
gem "rspec", "~> 2.10.0"
gem "yard", "~> 0.6.0"
gem "bundler", "~> 1.2.0"
gem "jeweler", "~> 1.6.4"
#gem "rcov", ">= 0"
gem 'pg'
gem 'rspec', '~> 2.10.0'
gem 'yard', '~> 0.6.0'
gem 'bundler', '>= 1.2.0'
gem 'jeweler', '~> 1.6.4'
gem 'sqlite3'
gem "rake"
gem 'rake'
end
66 changes: 37 additions & 29 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,31 +1,37 @@
GEM
remote: http://rubygems.org/
remote: https://rubygems.org/
specs:
activemodel (3.2.6)
activesupport (= 3.2.6)
builder (~> 3.0.0)
activerecord (3.2.6)
activemodel (= 3.2.6)
activesupport (= 3.2.6)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activesupport (3.2.6)
i18n (~> 0.6)
multi_json (~> 1.0)
arel (3.0.2)
builder (3.0.0)
activemodel (4.0.0)
activesupport (= 4.0.0)
builder (~> 3.1.0)
activerecord (4.0.0)
activemodel (= 4.0.0)
activerecord-deprecated_finders (~> 1.0.2)
activesupport (= 4.0.0)
arel (~> 4.0.0)
activerecord-deprecated_finders (1.0.3)
activesupport (4.0.0)
i18n (~> 0.6, >= 0.6.4)
minitest (~> 4.2)
multi_json (~> 1.3)
thread_safe (~> 0.1)
tzinfo (~> 0.3.37)
arel (4.0.0)
atomic (1.1.14)
builder (3.1.4)
diff-lcs (1.1.3)
git (1.2.5)
i18n (0.6.0)
git (1.2.6)
i18n (0.6.5)
jeweler (1.6.4)
bundler (~> 1.0)
git (>= 1.2.5)
rake
multi_json (1.3.6)
pg (0.14.0)
polyamorous (0.5.0)
activerecord (~> 3.0)
rake (0.9.2.2)
minitest (4.7.5)
multi_json (1.8.0)
pg (0.16.0)
polyamorous (0.6.4)
activerecord (>= 3.0)
rake (10.1.0)
rspec (2.10.0)
rspec-core (~> 2.10.0)
rspec-expectations (~> 2.10.0)
Expand All @@ -34,24 +40,26 @@ GEM
rspec-expectations (2.10.0)
diff-lcs (~> 1.1.3)
rspec-mocks (2.10.1)
sqlite3 (1.3.6)
squeel (1.0.11)
activerecord (~> 3.0)
activesupport (~> 3.0)
polyamorous (~> 0.5.0)
tzinfo (0.3.33)
sqlite3 (1.3.8)
squeel (1.1.1)
activerecord (>= 3.0)
activesupport (>= 3.0)
polyamorous (~> 0.6.0)
thread_safe (0.1.3)
atomic
tzinfo (0.3.37)
yard (0.6.8)

PLATFORMS
ruby

DEPENDENCIES
activerecord (>= 3.2.0)
bundler (~> 1.2.0)
bundler (>= 1.2.0)
jeweler (~> 1.6.4)
pg
rake
rspec (~> 2.10.0)
sqlite3
squeel (~> 1.0.11)
squeel (~> 1.1.1)
yard (~> 0.6.0)
8 changes: 3 additions & 5 deletions lib/rocket_tag/tag.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
module RocketTag
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy, :class_name => 'RocketTag::Tagging'
attr_accessible :name

validates_presence_of :name
validates_uniqueness_of :name

has_and_belongs_to_many :alias, :class_name => "RocketTag::Tag",
has_and_belongs_to_many :alias, lambda { uniq }, :class_name => "RocketTag::Tag",
:join_table => "alias_tags",
:foreign_key => "tag_id",
:association_foreign_key => "alias_id",
:uniq => true,
:after_add => :add_reverse_alias,
:after_remove => :remove_reverse_alias

def add_reverse_alias(tag)
[self.alias, self].flatten.each do |t|
tag.alias << t if !tag.alias.include?(t) && t != tag
end
end
end

def remove_reverse_alias(tag)
tag.alias.delete(self) if tag.alias.include?(self)
end
end

def alias?(that)
return self.alias.include?(that)
Expand Down
54 changes: 27 additions & 27 deletions lib/rocket_tag/taggable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def self.parse_tags list
require 'csv'
if list.kind_of? String
# for some reason CSV parser cannot handle
#
#
# hello, "foo"
#
# but must be
Expand Down Expand Up @@ -106,13 +106,13 @@ def tags_for_context context
def tagged_similar options = {}
context = options.delete :on

contexts = self.class.normalize_contexts context,
contexts = self.class.normalize_contexts context,
self.class.rocket_tag.contexts

q = self.class.tagged_with Hash[*contexts.map{|c|
q = self.class.tagged_with Hash[*contexts.map{|c|
[c, tags_for_context(c)]
}.flatten(1)]

# Exclude self from the results
q.where{id!=my{id}}

Expand Down Expand Up @@ -149,7 +149,7 @@ def normalize_contexts(context, default_if_nil = [])
def validate_contexts contexts
contexts.each do |context|
unless is_valid_context? context
raise Exception.new("#{context} is not a valid tag context for #{self}")
raise Exception.new("#{context} is not a valid tag context for #{self}")
end
end
end
Expand All @@ -176,16 +176,16 @@ def with_tag_context context
end

def tagged_with tags_list, options = {}

# Grab table name
t = self.table_name

q = joins{taggings.tag}
alias_tag_names = lambda do |list|

alias_tag_names = lambda do |list|
names = RocketTag::Tag.select{:name}.where do
id.in(RocketTag::Tag.select{'alias_tags.alias_id'}.joins(:alias).where{
tags.name.in(list)
tags.name.in(list)
})
end
names.map{|t| t.name}
Expand Down Expand Up @@ -229,17 +229,17 @@ def tagged_with tags_list, options = {}
# select * from ( ..... ) tags
# remove `.arel` dependency
q = from(q.as(self.table_name))

# Restrict by minimum tag counts if required
min = options.delete :min
q = q.where{tags_count>=min} if min
min = options.delete :min
q = q.where{tags_count>=min} if min

# Require all the tags if required
all, exact = options.delete(:all), options.delete(:exact)
q = q.where{tags_count==tags_list.length} if all || exact
q = q.joins{taggings.tag}.group("#{self.table_name}.id").having('COUNT(tags.id) = ?', tags_list.length) if exact

# Return the relation
# Return the relation
q
end

Expand Down Expand Up @@ -269,10 +269,10 @@ def tags(options = {})
# select * from ( ..... ) tags
q = RocketTag::Tag.from(q.as(RocketTag::Tag.table_name))
#q = RocketTag::Tag.from(q.arel.as(RocketTag::Tag.table_name))

# Restrict by minimum tag counts if required
min = options.delete :min
q = q.where{tags_count>=min} if min
min = options.delete :min
q = q.where{tags_count>=min} if min

# Return the relation
q
Expand Down Expand Up @@ -308,7 +308,7 @@ def setup_for_rocket_tag
exisiting_tag_names = exisiting_tags.map &:name

# Find missing tags
tags_names_to_create = list - exisiting_tag_names
tags_names_to_create = list - exisiting_tag_names

# Create missing tags
created_tags = tags_names_to_create.map do |tag_name|
Expand All @@ -319,9 +319,9 @@ def setup_for_rocket_tag
tags_to_assign = exisiting_tags + created_tags

tags_to_assign.each do |tag|
tagging = Tagging.new :tag => tag,
:taggable => self,
:context => context,
tagging = Tagging.new :tag => tag,
:taggable => self,
:context => context,
:tagger => nil
self.taggings << tagging
end
Expand All @@ -346,15 +346,15 @@ def attr_taggable *contexts
contexts.each do |context|
class_eval do

has_many "#{context}_taggings".to_sym,
:source => :taggable,
:as => :taggable,
:conditions => { :context => context }
has_many "#{context}_taggings".to_sym,
lambda { where(:context => context) },
:source => :taggable,
:as => :taggable

has_many "#{context}_tags".to_sym,
lambda { where(["taggings.context = ?", context]) },
:source => :tag,
:through => :taggings,
:conditions => [ "taggings.context = ?", context ]
:through => :taggings

validate context do
if not send(context).kind_of? Enumerable
Expand Down
12 changes: 1 addition & 11 deletions lib/rocket_tag/tagging.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
module RocketTag
class Tagging < ::ActiveRecord::Base

attr_accessible :tag,
:tag_id,
:context,
:taggable,
:taggable_type,
:taggable_id,
:tagger,
:tagger_type,
:tagger_id
class Tagging < ::ActiveRecord::Base

belongs_to :tag, :class_name => 'RocketTag::Tag'
belongs_to :taggable, :polymorphic => true
Expand Down
22 changes: 13 additions & 9 deletions rocket_tag.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ["Brad Phelan"]
s.date = "2012-07-11"
s.date = "2013-09-12"
s.description = ""
s.email = "bradphelan@xtargets.com"
s.extra_rdoc_files = [
Expand All @@ -29,53 +29,57 @@ Gem::Specification.new do |s|
"lib/generators/rocket_tag/migration/migration_generator.rb",
"lib/generators/rocket_tag/migration/templates/active_record/migration.rb",
"lib/rocket_tag.rb",
"lib/rocket_tag/alias_tag.rb",
"lib/rocket_tag/configuration.rb",
"lib/rocket_tag/tag.rb",
"lib/rocket_tag/taggable.rb",
"lib/rocket_tag/tagging.rb",
"rocket_tag.gemspec",
"spec/database.yml",
"spec/models.rb",
"spec/rocket_tag/configuration_spec.rb",
"spec/rocket_tag/tag_alias_spec.rb",
"spec/rocket_tag/taggable_spec.rb",
"spec/schema.rb",
"spec/spec_helper.rb"
]
s.homepage = "http://github.com/bradphelan/rocket_tag"
s.licenses = ["MIT"]
s.require_paths = ["lib"]
s.rubygems_version = "1.8.15"
s.rubygems_version = "2.0.2"
s.summary = "A modern fast tagging framework for Rails 3.1+"

if s.respond_to? :specification_version then
s.specification_version = 3
s.specification_version = 4

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<activerecord>, [">= 3.2.0"])
s.add_runtime_dependency(%q<squeel>, ["~> 1.0.0"])
s.add_runtime_dependency(%q<squeel>, ["~> 1.1.1"])
s.add_development_dependency(%q<pg>, [">= 0"])
s.add_development_dependency(%q<rspec>, ["~> 2.10.0"])
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
s.add_development_dependency(%q<bundler>, ["~> 1.1.0"])
s.add_development_dependency(%q<bundler>, [">= 1.2.0"])
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
s.add_development_dependency(%q<sqlite3>, [">= 0"])
s.add_development_dependency(%q<rake>, [">= 0"])
else
s.add_dependency(%q<activerecord>, [">= 3.2.0"])
s.add_dependency(%q<squeel>, ["~> 1.0.0"])
s.add_dependency(%q<squeel>, ["~> 1.1.1"])
s.add_dependency(%q<pg>, [">= 0"])
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
s.add_dependency(%q<yard>, ["~> 0.6.0"])
s.add_dependency(%q<bundler>, ["~> 1.1.0"])
s.add_dependency(%q<bundler>, [">= 1.2.0"])
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
s.add_dependency(%q<sqlite3>, [">= 0"])
s.add_dependency(%q<rake>, [">= 0"])
end
else
s.add_dependency(%q<activerecord>, [">= 3.2.0"])
s.add_dependency(%q<squeel>, ["~> 1.0.0"])
s.add_dependency(%q<squeel>, ["~> 1.1.1"])
s.add_dependency(%q<pg>, [">= 0"])
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
s.add_dependency(%q<yard>, ["~> 0.6.0"])
s.add_dependency(%q<bundler>, ["~> 1.1.0"])
s.add_dependency(%q<bundler>, [">= 1.2.0"])
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
s.add_dependency(%q<sqlite3>, [">= 0"])
s.add_dependency(%q<rake>, [">= 0"])
Expand Down
Loading