diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-12-29 17:45:39 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-12-29 17:45:39 +0000 |
commit | fa538bccd3c85ed40be3bf55c63f0c23753402b3 (patch) | |
tree | b296bb40e6565252a8f8259507289b59544bd9dc /lib/puppet/rails/external | |
parent | 01660045b77bb6b8e310cfd948ca50161348c748 (diff) | |
download | puppet-fa538bccd3c85ed40be3bf55c63f0c23753402b3.tar.gz puppet-fa538bccd3c85ed40be3bf55c63f0c23753402b3.tar.xz puppet-fa538bccd3c85ed40be3bf55c63f0c23753402b3.zip |
Moving the tagging stuff to an "external" directory, instead of "lib".
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1991 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/rails/external')
-rw-r--r-- | lib/puppet/rails/external/tagging/README | 4 | ||||
-rw-r--r-- | lib/puppet/rails/external/tagging/acts_as_taggable.rb | 62 | ||||
-rw-r--r-- | lib/puppet/rails/external/tagging/init.rb | 5 | ||||
-rw-r--r-- | lib/puppet/rails/external/tagging/tag.rb | 50 | ||||
-rw-r--r-- | lib/puppet/rails/external/tagging/tagging.rb | 12 |
5 files changed, 133 insertions, 0 deletions
diff --git a/lib/puppet/rails/external/tagging/README b/lib/puppet/rails/external/tagging/README new file mode 100644 index 000000000..8d2f90822 --- /dev/null +++ b/lib/puppet/rails/external/tagging/README @@ -0,0 +1,4 @@ +Acts As Taggable +================= + +Allows for tags to be added to multiple classes.
\ No newline at end of file diff --git a/lib/puppet/rails/external/tagging/acts_as_taggable.rb b/lib/puppet/rails/external/tagging/acts_as_taggable.rb new file mode 100644 index 000000000..137a1c2a8 --- /dev/null +++ b/lib/puppet/rails/external/tagging/acts_as_taggable.rb @@ -0,0 +1,62 @@ +module ActiveRecord
+ module Acts #:nodoc:
+ module Taggable #:nodoc:
+ def self.included(base)
+ base.extend(ClassMethods)
+ end
+
+ module ClassMethods
+ def acts_as_taggable(options = {})
+ write_inheritable_attribute(:acts_as_taggable_options, {
+ :taggable_type => ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s,
+ :from => options[:from]
+ })
+
+ class_inheritable_reader :acts_as_taggable_options
+
+ has_many :taggings, :as => :taggable, :dependent => true
+ has_many :tags, :through => :taggings
+
+ include ActiveRecord::Acts::Taggable::InstanceMethods
+ extend ActiveRecord::Acts::Taggable::SingletonMethods
+ end
+ end
+
+ module SingletonMethods
+ def find_tagged_with(list)
+ find_by_sql([
+ "SELECT #{table_name}.* FROM #{table_name}, tags, taggings " +
+ "WHERE #{table_name}.#{primary_key} = taggings.taggable_id " +
+ "AND taggings.taggable_type = ? " +
+ "AND taggings.tag_id = tags.id AND tags.name IN (?)",
+ acts_as_taggable_options[:taggable_type], list
+ ])
+ end
+ def tags(options = {})
+ options.merge!(:taggable_type => self.to_s)
+ Tag.tags(options)
+ end
+ end
+
+ module InstanceMethods
+ def tag_with(list)
+ Tag.transaction do
+ taggings.destroy_all
+
+ Tag.parse(list).each do |name|
+ if acts_as_taggable_options[:from]
+ send(acts_as_taggable_options[:from]).tags.find_or_create_by_name(name).on(self)
+ else
+ Tag.find_or_create_by_name(name).on(self)
+ end
+ end
+ end
+ end
+
+ def tag_list
+ tags.collect { |tag| tag.name.include?(" ") ? "'#{tag.name}'" : tag.name }.join(" ")
+ end
+ end
+ end
+ end
+end
diff --git a/lib/puppet/rails/external/tagging/init.rb b/lib/puppet/rails/external/tagging/init.rb new file mode 100644 index 000000000..5069d8040 --- /dev/null +++ b/lib/puppet/rails/external/tagging/init.rb @@ -0,0 +1,5 @@ +require 'puppet/rails/external/tagging/acts_as_taggable' +ActiveRecord::Base.send(:include, ActiveRecord::Acts::Taggable) + +require 'puppet/rails/external/tagging/tagging' +require 'puppet/rails/external/tagging/tag' diff --git a/lib/puppet/rails/external/tagging/tag.rb b/lib/puppet/rails/external/tagging/tag.rb new file mode 100644 index 000000000..191abb08c --- /dev/null +++ b/lib/puppet/rails/external/tagging/tag.rb @@ -0,0 +1,50 @@ +class Tag < ActiveRecord::Base + has_many :taggings + + def self.tags(options = {}) + query = "select tags.id, name, count(*) as count" + query << " from taggings, tags" + query << " where tags.id = tag_id" + query << " group by tag_id" + query << " order by #{options[:order]}" if options[:order] != nil + query << " limit #{options[:limit]}" if options[:limit] != nil + tags = Tag.find_by_sql(query) + end + + def self.parse(list) + tag_names = [] + + # first, pull out the quoted tags + list.gsub!(/\"(.*?)\"\s*/ ) { tag_names << $1; "" } + + # then, replace all commas with a space + list.gsub!(/,/, " ") + + # then, get whatever's left + tag_names.concat list.split(/\s/) + + # strip whitespace from the names + tag_names = tag_names.map { |t| t.strip } + + # delete any blank tag names + tag_names = tag_names.delete_if { |t| t.empty? } + + return tag_names + end + + def tagged + @tagged ||= taggings.collect { |tagging| tagging.taggable } + end + + def on(taggable) + taggings.create :taggable => taggable + end + + def ==(comparison_object) + super || name == comparison_object.to_s + end + + def to_s + name + end +end diff --git a/lib/puppet/rails/external/tagging/tagging.rb b/lib/puppet/rails/external/tagging/tagging.rb new file mode 100644 index 000000000..e06e88a14 --- /dev/null +++ b/lib/puppet/rails/external/tagging/tagging.rb @@ -0,0 +1,12 @@ +class Tagging < ActiveRecord::Base + belongs_to :tag + belongs_to :taggable, :polymorphic => true + + def self.tagged_class(taggable) + ActiveRecord::Base.send(:class_name_of_active_record_descendant, taggable.class).to_s + end + + def self.find_taggable(tagged_class, tagged_id) + tagged_class.constantize.find(tagged_id) + end +end
\ No newline at end of file |