likeit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,106 @@
1
+ = Likeit
2
+
3
+ Rails gem for building a liking systems by using Active Records.
4
+
5
+ by Gagan Sharma <developer.gagan@gmail.com>
6
+
7
+ GitHub Project: https://github.com/gagansharma/likeit
8
+
9
+ -----
10
+
11
+ TODO List:
12
+
13
+ * Better documentation (Making use of rdoc and ri)
14
+ * Write tests
15
+
16
+ == Installation
17
+
18
+ === Rails 3
19
+
20
+ If you would like to install it as gem, put this in your Gemfile:
21
+
22
+ gem 'likeit'
23
+
24
+ If you would rather like to install it as plugin, run this command in your console:
25
+
26
+ rails plugin install git://github.com/gagansharma/likeit.git
27
+
28
+ And then run:
29
+
30
+ rails generate likeit
31
+ rake db:migrate
32
+
33
+ == Usage
34
+
35
+ Just add `acts_as_liker` and `acts_as_likeable` to your models. You could mix them in the same model if you like. See the example below:
36
+
37
+ # A user can like on users or story
38
+
39
+ class User < ActiveRecord::Base
40
+ acts_as_liker
41
+ acts_as_likeable
42
+ end
43
+
44
+ class Story < ActiveRecord::Base
45
+ acts_as_likeable
46
+ end
47
+
48
+ ------------------------------------------------------------------------------------------------
49
+
50
+ # To like:
51
+
52
+ @user = User.find(1)
53
+ @user2 = User.find(2)
54
+ @story = Story.find(1)
55
+
56
+ @user1.like(@story)
57
+ @user1.like(@user2)
58
+
59
+ ------------------------------------------------------------------------------------------------
60
+
61
+ # To dis-like:
62
+ @user = User.find(1)
63
+ @user2 = User.find(2)
64
+ @story = Story.find(1)
65
+
66
+ @user1.dislike(@story)
67
+ @user1.dislike(@user2)
68
+
69
+ ------------------------------------------------------------------------------------------------
70
+
71
+ # To check like status:
72
+ @user = User.find(1)
73
+ @user3 = User.find(3)
74
+ @story = Story.find(1)
75
+
76
+ @user1.is_like(@story) #checks if @user1 already likes the @story or not -> return true or false
77
+ @user1.is_like(@user3) #checks if @user1 already likes @user3 or not -> return true or false
78
+
79
+ ------------------------------------------------------------------------------------------------
80
+
81
+ # To read all liked items by a user:
82
+
83
+ @user = User.find(1)
84
+ @user.likings #return all the users and stories which are liked by @user
85
+
86
+ ------------------------------------------------------------------------------------------------
87
+
88
+ # To get all the users who liked any story or user:
89
+
90
+ @user = User.find(1)
91
+ @user2 = User.find(2)
92
+ @story = Story.find(1)
93
+
94
+ @user2.likes #return all the users who liked @user2
95
+ @story.likes #return all the users who liked @story
96
+
97
+ ------------------------------------------------------------------------------------------------
98
+
99
+ # To get count of all the users who liked any story or user:
100
+
101
+ @user = User.find(1)
102
+ @user2 = User.find(2)
103
+ @story = Story.find(1)
104
+
105
+ @user2.likes.count #return count of all the users who liked @user2
106
+ @story.likes.count #return count of all the users who liked @story
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('likeit', '0.0.1') do |p|
6
+ p.description = "A generic Liking system."
7
+ p.url = "https://github.com/gagansharma/likeit"
8
+ p.author = "Gagan Sharma"
9
+ p.email = "developer.gagan@gmail.com"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.development_dependencies = []
12
+ end
13
+
14
+ Dir["#{File.dirname(__FILE__)}/tasks/*.take"].sort.each { |ext| load ext }
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'likeit'
@@ -0,0 +1,28 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ class LikeitGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ def self.source_root
8
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
9
+ end
10
+
11
+ # Implement the required interface for Rails::Generators::Migration.
12
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
13
+ def self.next_migration_number(dirname)
14
+ if ActiveRecord::Base.timestamped_migrations
15
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
16
+ else
17
+ "%.3d" % (current_migration_number(dirname) + 1)
18
+ end
19
+ end
20
+
21
+ def create_migration_file
22
+ migration_template 'migration.rb', 'db/migrate/likeit_migration.rb'
23
+ end
24
+
25
+ def create_model
26
+ template 'model.rb', File.join('app/models', 'like.rb')
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ class LikeitMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :likes, :force => true do |t|
4
+ t.references :liker, :polymorphic => true, :null => false
5
+ t.references :likeable, :polymorphic => true, :null => false
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :likes, [:liker_id, :liker_type]
10
+ add_index :likes, [:likeable_id, :likeable_type]
11
+ end
12
+
13
+ def self.down
14
+ drop_table :likes
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class Like < ActiveRecord::Base
2
+ belongs_to :liker, :polymorphic => true
3
+ belongs_to :likeable, :polymorphic => true
4
+ validates_uniqueness_of :liker_id, :scope => [:liker_type, :likeable_id, :likeable_type]
5
+
6
+ class << self
7
+ def likes_on(likeable)
8
+ where(["likeable_id = ? AND likeable_type = ?", likeable.id, likeable.class.name])
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Likeit
2
+ module Likeable
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def acts_as_likeable
9
+ has_many :likes, :as => :likeable, :dependent => :destroy
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ module Likeit
2
+ module Liker
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def acts_as_liker
9
+ has_many :likings, :as => :liker, :dependent => :destroy, :class_name => "Like"
10
+ include Likeit::Liker::InstanceMethods
11
+ end
12
+ end
13
+
14
+ module InstanceMethods
15
+ def like(likeable)
16
+ self.likings.create(:likeable => likeable)
17
+ end
18
+
19
+ def dislike(likeable)
20
+ likes = self.likings.likes_on(likeable)
21
+ likes.destroy_all if likes.present?
22
+ end
23
+
24
+ def is_like(likeable)
25
+ likes = self.likings.likes_on(likeable)
26
+ if likes.present?
27
+ true
28
+ else
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/likeit.rb ADDED
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + "/likeit/liker"
2
+ require File.dirname(__FILE__) + "/likeit/likeable"
3
+
4
+ ActiveRecord::Base.send(:include, Likeit::Liker)
5
+ ActiveRecord::Base.send(:include, Likeit::Likeable)
data/likeit.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{likeit}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Gagan Sharma"]
9
+ s.date = %q{2012-07-20}
10
+ s.description = %q{A generic liking system.}
11
+ s.email = %q{developer.gagan@gmail.com}
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/likeit.rb", "lib/likeit/likeable.rb", "lib/likeit/liker.rb", "lib/generators/likeit_generator.rb", "lib/generators/templates/migration.rb", "lib/generators/templates/model.rb"]
13
+ s.files = ["README.rdoc", "Rakefile", "likeit.gemspec", "init.rb", "lib/likeit.rb", "lib/likeit/likeable.rb", "lib/likeit/liker.rb", "lib/generators/likeit_generator.rb", "lib/generators/templates/migration.rb", "lib/generators/templates/model.rb"]
14
+ s.homepage = %q{https://github.com/gagansharma/likeit}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Likeit", "--main", "README.rdoc"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{likeit}
18
+ s.rubygems_version = %q{1.3.7}
19
+ s.summary = %q{A generic Liking system.}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 1
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ else
27
+ end
28
+ else
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: likeit
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Gagan Sharma
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-07-20 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: A generic liking system.
22
+ email: developer.gagan@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - README.rdoc
29
+ - lib/likeit.rb
30
+ - lib/likeit/likeable.rb
31
+ - lib/likeit/liker.rb
32
+ - lib/generators/likeit_generator.rb
33
+ - lib/generators/templates/migration.rb
34
+ - lib/generators/templates/model.rb
35
+ files:
36
+ - README.rdoc
37
+ - Rakefile
38
+ - likeit.gemspec
39
+ - init.rb
40
+ - lib/likeit.rb
41
+ - lib/likeit/likeable.rb
42
+ - lib/likeit/liker.rb
43
+ - lib/generators/likeit_generator.rb
44
+ - lib/generators/templates/migration.rb
45
+ - lib/generators/templates/model.rb
46
+ homepage: https://github.com/gagansharma/likeit
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --line-numbers
52
+ - --inline-source
53
+ - --title
54
+ - Likeit
55
+ - --main
56
+ - README.rdoc
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ hash: 3
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 11
74
+ segments:
75
+ - 1
76
+ - 2
77
+ version: "1.2"
78
+ requirements: []
79
+
80
+ rubyforge_project: likeit
81
+ rubygems_version: 1.8.15
82
+ signing_key:
83
+ specification_version: 1
84
+ summary: A generic Liking system.
85
+ test_files: []
86
+