act_as_buddy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 kannancet
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,112 @@
1
+ = act_as_buddy
2
+
3
+ act_as_buddy is a gem to allow any model to implement self relation. For eg: the friendships of a user can be implemented easily by self relation technique of act_as_buddy.
4
+ Any Model can be buddied or lopped on to itself. Main uses would be for Users create friends etc..
5
+ Eg: User has many friends and friends are members of users table itself.
6
+ This is expected to be heavily useful in social networking domain.
7
+
8
+
9
+ == Installation
10
+
11
+ === The master branch supports rails 3
12
+
13
+ Add the gem to the gemfile:
14
+ gem "act_as_buddy"
15
+
16
+ Run the generator:
17
+ rails generate act_as_buddy
18
+
19
+ This will generate a migration file as well as a model called BuddyMapper.Then do:
20
+ rake db:migrate
21
+
22
+ This will migrate the buddy_mappers table to database.
23
+
24
+ === Rails <=3.0.0 is NOT SUPPORTED
25
+
26
+ The gem version does not work with rails <=3.0.0. Sorry guys its right time you guys think about an upgrade ;)
27
+
28
+
29
+ == Usage
30
+
31
+ === Setup
32
+
33
+ Make your model(s) that you want to allow to be buddied act_as_buddy, just add the mixin:
34
+ class User < ActiveRecord::Base
35
+ ...
36
+ act_as_buddeable
37
+ ...
38
+ end
39
+
40
+ ---
41
+
42
+ === act_as_buddy methods
43
+
44
+ To have an object start buddying another object of same model use the following:
45
+ user1 = User.first(1)
46
+ user2 = User.first(2)
47
+ user1.add_buddy(user2) # Creates a messaage of containing the id of buddied records.
48
+
49
+ To remove a buddy from buddy list
50
+ user1.remove_buddy(user2) # Returns a message saying that the object ids are un-buddied.
51
+
52
+ You can check to see if an object is buddied to other object of same type:
53
+ user1.is_a_buddy_of?(user2) # Returns true or false
54
+
55
+ To get the total number (count) of buddies of an object.
56
+ user1.get_buddy_count # Returns an integer
57
+
58
+ To get the actual list of all buddies of an object.
59
+ user1.fetch_all_buddies # Returns an array of all buddied objects
60
+
61
+ To find a buddy of an object with a field exactly matching a value
62
+ user1.find_buddies_with(:name => "ashik")
63
+ # Returns the buddied object of the parent object matching the field value exactly. Eg: friends of user1 with name='ashik'.
64
+
65
+ To find buddies of an object with a field matching a value like argument string.
66
+ user1.find_buddies_like(:name => "ash")
67
+ # Returns an array of all buddied objects of the parent object having name similar to field value. Eg: friends of user1 with name like 'ash'.result - [<#User3ashik>]
68
+
69
+ To add multiple buddies to the buddy list (or 'Bulk Buddying') of an object.
70
+ user1.add_multiple_buddies(args)
71
+ # args is an array of all buddies to be added. They should all the of same type as parent object.
72
+
73
+ To remove multiple buddies from the buddy list (or 'Bulk Buddy Removal') of an object.
74
+ user1.remove_multiple_buddies(args)
75
+ # args is an array of all buddies to be added. They should all the of same type as parent object.
76
+
77
+ To remove all buddies from the buddy list (or 'Bulk Buddy Removal') of an object.
78
+ user1.remove_all_buddies()
79
+
80
+
81
+ === Testing the Gem
82
+ * Fork the project.
83
+ * Goto the root folder.
84
+ * Execute 'bundle install'.
85
+ * Execute 'bundle exec dummier'.
86
+ * This will create the test app and all dependencies for testing.
87
+ * Execute 'rake test' or simply 'rake'.
88
+
89
+ == Comments/Requests
90
+
91
+ If anyone has comments or questions please let me know (krxcet@gmail.com or kannanr@qburst.com).
92
+ If you have updates or patches or want to contribute I would love to see what you have or want to add.
93
+
94
+
95
+ == Note on Patches/Pull Requests
96
+
97
+ * Fork the project.
98
+ * Make your feature addition or bug fix.
99
+ * Add tests for it. This is important so I don't break it in a future version unintentionally (act_as_buddy uses Shoulda and Dummier)
100
+ * Send me a pull request. Bonus points for topic branches.
101
+
102
+
103
+ == Contributers
104
+
105
+ This list is open to all. You are all welcome :).
106
+
107
+ * kannacet (Kannan Reghu a.k.a 'Shrank') - https://github.com/kannancet
108
+
109
+
110
+ Copyright (c) 2013 kannancet(krxcet@gmail.com, kannanr@qburst.com). See LICENSE.txt for
111
+ further details.
112
+
@@ -0,0 +1,8 @@
1
+ =begin
2
+ This will be the base module for act as buddy.
3
+ =end
4
+ require "act_as_buddy/utils"
5
+ module ActAsBuddy
6
+ autoload :Buddeable, 'act_as_buddy/buddeable'
7
+ require "act_as_buddy/railtie" if defined?(Rails) && Rails::VERSION::MAJOR >= 3
8
+ end
@@ -0,0 +1,211 @@
1
+ =begin
2
+ This file contains the functions and classes for adding, removing, finding buddies.
3
+ The core logic is implemented here.
4
+ =end
5
+ module ActAsBuddy
6
+ module Buddeable
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ =begin
12
+ Class methods that add the relations to the class on which ac_as_buddy is called.
13
+ =end
14
+ module ClassMethods
15
+ def act_as_buddeable
16
+ has_many :buddy_mappers, :foreign_key => "buddeable_parent_id", :as => :buddeable
17
+ include ActAsBuddy::Buddeable::InstanceMethods
18
+ include ActAsBuddy::Util
19
+ end
20
+ end
21
+
22
+ =begin
23
+ Instance methods on the class on which act_as_buddy is defined are implemented here.
24
+ =end
25
+ module InstanceMethods
26
+
27
+ =begin
28
+ This function is used to add buddies to the given object.
29
+ =end
30
+ def add_buddy(*args)
31
+ couple_buddies, child_buddy = check_argument_pattern(*args)
32
+ build_buddy_collection([child_buddy])
33
+ p "#{self.class.to_s}s with id:#{self.id} and #{child_buddy.id} are now buddies."
34
+ end
35
+
36
+ =begin
37
+ This function is used to remove buddies to the given object.
38
+ =end
39
+ def remove_buddy(*args)
40
+ couple_buddies, child_buddy = check_argument_pattern(*args)
41
+ couple_buddies.map(&:destroy)
42
+ p "#{self.class.to_s}s with id:#{self.id} and #{child_buddy.id} are now un-buddied."
43
+ end
44
+
45
+ =begin
46
+ This function is used to get all buddies of an object.
47
+ =end
48
+ def fetch_all_buddies
49
+ self.class.joins(:buddy_mappers).where("buddy_mappers.buddeable_child_id=?", self.id)
50
+ end
51
+
52
+ =begin
53
+ This function is used to get the count of all buddies.
54
+ =end
55
+ def get_buddy_count
56
+ self.class.joins(:buddy_mappers).where("buddy_mappers.buddeable_child_id=?", self.id).size
57
+ end
58
+
59
+ =begin
60
+ This function is used to destroy all
61
+ =end
62
+ def remove_all_buddies
63
+ BuddyMapper.delete_all("buddeable_parent_id=#{self.id} OR buddeable_child_id=#{self.id} AND buddeable_type='#{self.class.to_s}'")
64
+ end
65
+
66
+ =begin
67
+ This function is used to add bulk number of buddies.
68
+ =end
69
+ def add_multiple_buddies(*args)
70
+ if args.blank?
71
+ raise "Argument empty!Add buddy needs an argument of same type which invokes the method."
72
+ return
73
+ end
74
+ buddy_collection = args.first
75
+ if buddy_collection.collect(&:id).include?(self.id)
76
+ raise "Loop association error! Cannot associate a record to itself."
77
+ return
78
+ end
79
+ unless buddy_collection.is_a?(Array) || (buddy_collection.select{|elmnt| elmnt.class != self.class}).blank?
80
+ raise "Argument type mismatch! Argument should be an array of objects of same type and of the type same class which invokes the function."
81
+ return
82
+ end
83
+ build_buddy_collection(buddy_collection)
84
+ end
85
+
86
+ =begin
87
+ This function is used to delete bulk number of buddies.
88
+ =end
89
+ def remove_multiple_buddies(*args)
90
+ if args.blank?
91
+ raise "Argument empty!Add buddy needs an argument of same type which invokes the method."
92
+ return
93
+ end
94
+ buddy_collection = args.first
95
+ if buddy_collection.collect(&:id).include?(self.id)
96
+ raise "Loop association error! Cannot associate a record to itself."
97
+ return
98
+ end
99
+ unless buddy_collection.is_a?(Array) || (buddy_collection.select{|elmnt| elmnt.class != self.class}).blank?
100
+ raise "Argument type mismatch! Argument should be an array of objects of same type and of the type same class which invokes the function."
101
+ return
102
+ end
103
+ associated_buddy_mappers = BuddyMapper.where("(buddeable_parent_id=#{self.id} AND buddeable_child_id in (?)) OR ((buddeable_child_id=#{self.id} AND buddeable_parent_id in (?)))", buddy_collection.collect(&:id), buddy_collection.collect(&:id))
104
+ associated_buddy_mappers.destroy_all
105
+ end
106
+
107
+ =begin
108
+ This function is used to find the buddies of a parent by conditions.
109
+ =end
110
+ def find_buddies_with(params = {})
111
+ (raise "Argument cannot be blank." and return) if params.empty?
112
+ (raise "Argument needs to be a hash." and return) unless params.is_a?(Hash)
113
+ self.class.joins(:buddy_mappers).where("buddy_mappers.buddeable_child_id=? AND #{self.class.table_name}.#{params.keys.first.to_s}=?", self.id, params.values.first.to_s).first
114
+ end
115
+
116
+ =begin
117
+ This function is used to find the buddies of a parent by with like conditions.
118
+ =end
119
+ def find_buddies_like(params = {})
120
+ (raise "Argument cannot be blank." and return) if params.empty?
121
+ (raise "Argument needs to be a hash." and return) unless params.is_a?(Hash)
122
+ self.class.joins(:buddy_mappers).where("buddy_mappers.buddeable_child_id=? AND #{self.class.table_name}.#{params.keys.first.to_s} like ?", self.id, "%#{params.values.first.to_s}%")
123
+ end
124
+
125
+ =begin
126
+ This function is used to test if two objects are buddied to each other.
127
+ =end
128
+ def is_a_buddy_of?(*args)
129
+ if args.blank?
130
+ raise "Argument empty!Add buddy needs an argument of same type which invokes the method."
131
+ return
132
+ end
133
+ child_buddy = args.first
134
+ unless child_buddy.is_a?(Object)
135
+ raise "Argument mismatch! Argument needs to be an Object."
136
+ return
137
+ end
138
+ check_buddy = BuddyMapper.where("(buddeable_parent_id=#{self.id} AND buddeable_child_id=#{child_buddy.id}) OR (buddeable_parent_id=#{child_buddy.id} AND buddeable_child_id=#{self.id})")
139
+ check_buddy.blank? ? false : true
140
+ end
141
+
142
+ =begin
143
+ Private functions begin here.
144
+ =end
145
+ private
146
+
147
+ =begin
148
+ This function is used to check the argument type and render errors.
149
+ =end
150
+ def check_argument_pattern(*args)
151
+ if args.blank?
152
+ raise "Argument empty!Add buddy needs an argument of same type which invokes the method."
153
+ return
154
+ end
155
+ child_buddy = args.first
156
+ unless child_buddy.is_a?(Object)
157
+ raise "Argument mismatch! Argument needs to be an Object."
158
+ return
159
+ end
160
+ if child_buddy.class != self.class
161
+ raise "Argument mismatch! Buddy can associate only objects of same type."
162
+ return
163
+ end
164
+ if child_buddy.id == self.id
165
+ raise "Loop association error! Cannot associate a record to itself."
166
+ return
167
+ end
168
+ couple_buddies = find_couple_buddies(child_buddy)
169
+ unless couple_buddies.blank?
170
+ if caller[0].include? "add_buddy"
171
+ raise "This buddy is already associated."
172
+ return
173
+ end
174
+ else
175
+ if caller[0].include? "remove_buddy"
176
+ raise "These buddies are not associated yet."
177
+ return
178
+ end
179
+ end
180
+ return couple_buddies, child_buddy
181
+ end
182
+
183
+ =begin
184
+ This function is used to find the couple buddies given two records.
185
+ =end
186
+ def find_couple_buddies(child_buddy)
187
+ BuddyMapper.where("(buddeable_child_id=? AND buddeable_parent_id=?) OR (buddeable_child_id=? AND buddeable_parent_id=?) AND buddeable_type=?", child_buddy.id, self.id, self.id, child_buddy.id, self.class.to_s)
188
+ end
189
+
190
+ =begin
191
+ This function is used to build the buddy records.
192
+ This function accepts a acollection of buddies and builds the records.
193
+ =end
194
+ def build_buddy_collection(*args)
195
+ buddy_collection = args.first
196
+ buddy_collection.each do |buddy|
197
+ parent, child = self.id, buddy.id
198
+ BuddyMapper.transaction do
199
+ 2.times do
200
+ BuddyMapper.create(:buddeable_parent_id => parent,
201
+ :buddeable_child_id => child,
202
+ :buddeable_type => self.class.to_s)
203
+ parent, child = child, parent
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,15 @@
1
+ =begin
2
+ This module defines a class a communicate to Railtie and add a middle ware.
3
+ =end
4
+ require 'act_as_buddy'
5
+ require 'rails'
6
+
7
+ module ActAsBuddy
8
+ class Railtie < Rails::Railtie
9
+ initializer 'act_as_buddy.initialize' do
10
+ ActiveSupport.on_load(:active_record) do
11
+ include ActAsBuddy::Buddeable
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ =begin
2
+ All the module level utility functions are defined here.
3
+ =end
4
+ module ActAsBuddy
5
+
6
+ =begin
7
+ This defines the basic getter and setter methods on module level.
8
+ =end
9
+ def self.buddy_attr_accessor(*args)
10
+ args.each do |arg|
11
+ self.class_eval("def self.#{arg};@@#{arg};end")
12
+ self.class_eval("def self.#{arg}=(val);@@#{arg}=val;end")
13
+ end
14
+ end
15
+
16
+ module Util
17
+ =begin
18
+ Retrieves the parent class name if using STI.
19
+ =end
20
+ def parent_class_name(obj)
21
+ if obj.class.superclass != ActiveRecord::Base
22
+ return obj.class.superclass.name
23
+ end
24
+ return obj.class.name
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ Description:
2
+ rails generate act_as_buddy
3
+
4
+ no need to specify a name after act_as_buddy as you can not change the model name from BuddyMapper
5
+ the act_as_buddy_migration file will be created in db/migrate
@@ -0,0 +1,36 @@
1
+ =begin
2
+ This class implements the generator creation for creating the models and migrations.
3
+ These are needed for proper functioning of gem.
4
+ =end
5
+ require 'rails/generators'
6
+ require 'rails/generators/migration'
7
+
8
+ class ActAsBuddyGenerator < Rails::Generators::Base
9
+
10
+ include Rails::Generators::Migration
11
+
12
+ def self.source_root
13
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
14
+ end
15
+
16
+ =begin
17
+ Implement the required interface for Rails::Generators::Migration.
18
+ taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
19
+ =end
20
+ def self.next_migration_number(dirname)
21
+ if ActiveRecord::Base.timestamped_migrations
22
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
23
+ else
24
+ "%.3d" % (current_migration_number(dirname) + 1)
25
+ end
26
+ end
27
+
28
+ def create_migration_file
29
+ migration_template 'migration.rb', 'db/migrate/act_as_buddy_migration.rb'
30
+ end
31
+
32
+ def create_model
33
+ template "model.rb", File.join('app/models', "buddy_mapper.rb")
34
+ end
35
+
36
+ end
@@ -0,0 +1,17 @@
1
+ class ActAsBuddyMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :buddy_mappers, :force => true do |t|
4
+ t.string :buddeable_type
5
+ t.integer :buddeable_parent_id
6
+ t.integer :buddeable_child_id
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :buddy_mappers, ["buddeable_parent_id"], :name => "index_buddeable_parent"
11
+ add_index :buddy_mappers, ["buddeable_child_id"], :name => "index_buddeable_child"
12
+ end
13
+
14
+ def self.down
15
+ drop_table :buddy_mappers
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ class BuddyMapper < ActiveRecord::Base
2
+ include ActiveModel::MassAssignmentSecurity
3
+ attr_accessible :id,
4
+ :buddeable_child_id,
5
+ :buddeable_parent_id,
6
+ :buddeable_type,
7
+ :created_at,
8
+ :updated_at
9
+ belongs_to :buddeable, :polymorphic => true
10
+
11
+ end
@@ -0,0 +1,21 @@
1
+ run "rails g scaffold user name:string"
2
+
3
+ gsub_file "app/models/user.rb", "end", %(
4
+ act_as_buddeable
5
+
6
+ end)
7
+ run "rails g model BuddyMapper buddeable_child_id:integer buddeable_parent_id:integer buddeable_type:string"
8
+
9
+ gsub_file "app/models/buddy_mapper.rb", "end", %(
10
+ include ActiveModel::MassAssignmentSecurity
11
+ attr_accessible :id,
12
+ :buddeable_child_id,
13
+ :buddeable_parent_id,
14
+ :buddeable_type,
15
+ :created_at,
16
+ :updated_at
17
+ belongs_to :buddeable, :polymorphic => true
18
+
19
+ end)
20
+ run "rake db:create"
21
+ run "rake db:migrate"
@@ -0,0 +1,112 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class FunctionTest < ActiveSupport::TestCase
4
+ USERS = ['kannan', 'rahul', 'ashik', 'sunil', 'arun', 'jojith']
5
+
6
+ context "General - " do
7
+
8
+ setup do
9
+ BuddyMapper.delete_all
10
+ USERS.collect do |user|
11
+ created_user = User.find_or_create_by_name(user)
12
+ instance_variable_set('@'+user, created_user)
13
+ end
14
+ @kannan.add_buddy(@sunil)
15
+ @kannan.add_buddy(@ashik)
16
+ end
17
+
18
+ context "All buddy records" do
19
+
20
+ should "define act_as_buddy instance methods" do
21
+ assert @kannan.respond_to?(:add_buddy)
22
+ assert @kannan.respond_to?(:remove_buddy)
23
+ assert @kannan.respond_to?(:fetch_all_buddies)
24
+ assert @kannan.respond_to?(:remove_all_buddies)
25
+ assert @kannan.respond_to?(:add_multiple_buddies)
26
+ assert @kannan.respond_to?(:find_buddies_with)
27
+ assert @kannan.respond_to?(:find_buddies_like)
28
+ assert @kannan.respond_to?(:is_a_buddy_of?)
29
+ end
30
+
31
+ end
32
+
33
+ context "Testing add_buddy method - " do
34
+
35
+ should "return true for correct buddy mapping" do
36
+ assert @kannan.is_a_buddy_of?(@sunil)
37
+ assert @kannan.is_a_buddy_of?(@ashik)
38
+ assert @ashik.is_a_buddy_of?(@kannan)
39
+ assert @sunil.is_a_buddy_of?(@kannan)
40
+ end
41
+
42
+ should "return false for incorrect buddy mapping" do
43
+ assert "false", @rahul.is_a_buddy_of?(@kannan).to_s
44
+ assert "false", @sunil.is_a_buddy_of?(@ashik).to_s
45
+ end
46
+
47
+ end
48
+
49
+ context "Testing fetch_all_buddies - " do
50
+
51
+ should "return buddy count " do
52
+ assert "2", @kannan.fetch_all_buddies.size.to_s
53
+ assert "1", @sunil.fetch_all_buddies.size.to_s
54
+ assert "1", @ashik.fetch_all_buddies.size.to_s
55
+ assert "0", @rahul.fetch_all_buddies.size.to_s
56
+ end
57
+
58
+ end
59
+
60
+ context "Testing add_multiple buddies - " do
61
+
62
+ setup do
63
+ @kannan.add_multiple_buddies([@jojith, @rahul])
64
+ end
65
+
66
+ should "return buddy count " do
67
+ assert "4", @kannan.fetch_all_buddies.size.to_s
68
+ assert "1", @jojith.fetch_all_buddies.size.to_s
69
+ assert "1", @rahul.fetch_all_buddies.size.to_s
70
+ end
71
+
72
+ end
73
+
74
+ context "Testing remove_multiple_buddies - " do
75
+
76
+ setup do
77
+ @kannan.remove_multiple_buddies([@jojith, @rahul])
78
+ end
79
+
80
+ should "return buddy count " do
81
+ assert "2", @kannan.fetch_all_buddies.size.to_s
82
+ assert "0", @jojith.fetch_all_buddies.size.to_s
83
+ assert "0", @rahul.fetch_all_buddies.size.to_s
84
+ end
85
+
86
+ end
87
+
88
+ context "Testing find_buddies_with and find_buddies_like- " do
89
+
90
+ should "return buddy name " do
91
+ assert "sunil", @kannan.find_buddies_with(:name => 'sunil').name
92
+ assert "sunil", @kannan.find_buddies_like(:name => 'sun').first.name
93
+ end
94
+
95
+ end
96
+
97
+ context "Testing remove_all_buddies - " do
98
+
99
+ setup do
100
+ @kannan.remove_all_buddies
101
+ end
102
+
103
+ should "return buddy count " do
104
+ assert "0", @kannan.fetch_all_buddies.size.to_s
105
+ assert "0", @sunil.fetch_all_buddies.size.to_s
106
+ assert "0", @ashik.fetch_all_buddies.size.to_s
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,14 @@
1
+
2
+ #Configure Rails Environment
3
+ ENV["RAILS_ENV"] = "test"
4
+
5
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
6
+ require "rails/test_help"
7
+
8
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
9
+ ActiveRecord::Migration.verbose = false
10
+
11
+
12
+ require File.dirname(__FILE__) + '/../lib/generators/templates/model.rb'
13
+
14
+ require 'shoulda'
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: act_as_buddy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - kannancet
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: shoulda
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.12'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.12'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: jeweler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.8.4
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.8.4
78
+ - !ruby/object:Gem::Dependency
79
+ name: rcov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 0.9.11
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.11
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: activerecord
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 3.1.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 3.1.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: rails
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: dummier
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: 0.3.2
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: 0.3.2
158
+ - !ruby/object:Gem::Dependency
159
+ name: sqlite3
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ description: This gem is used to implement self relation in a rails project for any
175
+ table. The gem will automatically manage self relation implementation on mumtiple
176
+ tables.
177
+ email: krxcet@gmail.com
178
+ executables: []
179
+ extensions: []
180
+ extra_rdoc_files:
181
+ - LICENSE.txt
182
+ - README.rdoc
183
+ files:
184
+ - lib/act_as_buddy.rb
185
+ - lib/act_as_buddy/buddeable.rb
186
+ - lib/act_as_buddy/railtie.rb
187
+ - lib/act_as_buddy/utils.rb
188
+ - lib/generators/USAGE
189
+ - lib/generators/act_as_buddy_generator.rb
190
+ - lib/generators/templates/migration.rb
191
+ - lib/generators/templates/model.rb
192
+ - LICENSE.txt
193
+ - README.rdoc
194
+ - test/test_helper.rb
195
+ - test/test_buddy_functions.rb
196
+ - test/dummy_hooks/after_app_generator.rb
197
+ homepage: http://github.com/kannancet/act_as_buddy
198
+ licenses:
199
+ - BSD
200
+ post_install_message:
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ segments:
211
+ - 0
212
+ hash: -175955441
213
+ required_rubygems_version: !ruby/object:Gem::Requirement
214
+ none: false
215
+ requirements:
216
+ - - ! '>='
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ requirements: []
220
+ rubyforge_project:
221
+ rubygems_version: 1.8.24
222
+ signing_key:
223
+ specification_version: 3
224
+ summary: A gem to implement self relation on any table.
225
+ test_files:
226
+ - test/test_helper.rb
227
+ - test/test_buddy_functions.rb
228
+ - test/dummy_hooks/after_app_generator.rb