mongoid_socializer_actions 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +35 -1
- data/app/models/share.rb +8 -0
- data/lib/mongoid_socializer_actions/likeable.rb +0 -1
- data/lib/mongoid_socializer_actions/sharable.rb +15 -0
- data/lib/mongoid_socializer_actions/sharer.rb +107 -0
- data/lib/mongoid_socializer_actions/version.rb +1 -1
- data/lib/mongoid_socializer_actions.rb +5 -1
- data/spec/mongoid/models/album.rb +1 -0
- data/spec/mongoid/models/photo.rb +1 -0
- data/spec/mongoid/models/user.rb +1 -0
- data/spec/mongoid/mongoid_socializer_actions/shares_spec.rb +103 -0
- data/spec/spec_helper.rb +1 -1
- metadata +10 -5
data/Readme.md
CHANGED
@@ -125,8 +125,42 @@ You can query for comments like that:
|
|
125
125
|
photo.commenters
|
126
126
|
# => [user]
|
127
127
|
|
128
|
+
## SHARES
|
129
|
+
Add the Sharer module in User model and Sharable in Photo, Album etc.
|
130
|
+
|
131
|
+
class User
|
132
|
+
include Mongoid::Document
|
133
|
+
|
134
|
+
include Mongoid::Sharer
|
135
|
+
end
|
136
|
+
|
137
|
+
class Photo
|
138
|
+
include Mongoid::Document
|
139
|
+
|
140
|
+
include Mongoid::Sharable
|
141
|
+
end
|
142
|
+
|
143
|
+
You can now comment objects like this:
|
144
|
+
|
145
|
+
user = User.create
|
146
|
+
photo = Photo.create
|
147
|
+
|
148
|
+
user.share(photo)
|
149
|
+
|
150
|
+
You can query for comments like that:
|
151
|
+
|
152
|
+
photo.sharers
|
153
|
+
# => [user]
|
154
|
+
|
155
|
+
user.unshare(photo)
|
156
|
+
# => true
|
157
|
+
|
158
|
+
user.photo_shares_count
|
159
|
+
# => 1
|
160
|
+
|
161
|
+
photo.shares_count
|
162
|
+
# => 1
|
128
163
|
|
129
164
|
# TODOs
|
130
165
|
|
131
|
-
- Implement sharable
|
132
166
|
- Implement taggable
|
data/app/models/share.rb
ADDED
@@ -4,7 +4,6 @@ module Mongoid
|
|
4
4
|
|
5
5
|
included do |base|
|
6
6
|
base.field :likers_count, :type => Integer, :default => 0
|
7
|
-
base.field :liker_ids, :type => Array, :default => []
|
8
7
|
base.has_many :likes, :class_name => 'Mongoid::Like', :as => :likable, :dependent => :destroy
|
9
8
|
base.has_and_belongs_to_many :likers, :class_name => 'User', :inverse_of => nil
|
10
9
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Sharable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |base|
|
6
|
+
base.field :shares_count, :type => Integer, :default => 0
|
7
|
+
base.has_many :shares, :class_name => 'Mongoid::Share', :as => :sharable, :dependent => :destroy
|
8
|
+
end
|
9
|
+
|
10
|
+
def sharers
|
11
|
+
sharer_ids = shares.distinct('sharer_id')
|
12
|
+
User.find(sharer_ids)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Sharer
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |base|
|
6
|
+
base.has_many :shares, :class_name => 'Mongoid::Share', :inverse_of => :sharer, :dependent => :destroy
|
7
|
+
end
|
8
|
+
|
9
|
+
# share a model
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
# => @john.share(@photo)
|
13
|
+
def share(model)
|
14
|
+
model.before_shared_by(self) if model.respond_to?('before_shared_by')
|
15
|
+
shares << model.shares.create!
|
16
|
+
model.inc(:shares_count, 1)
|
17
|
+
model.after_shared_by(self) if model.respond_to?('after_shared_by')
|
18
|
+
self.before_share(model) if self.respond_to?('before_share')
|
19
|
+
self.after_share(model) if self.respond_to?('after_share')
|
20
|
+
end
|
21
|
+
|
22
|
+
# unshare a model
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
# => @john.unshare(@photo)
|
26
|
+
def unshare(model)
|
27
|
+
if shared?(model)
|
28
|
+
model.reload
|
29
|
+
self.reload
|
30
|
+
|
31
|
+
shares.where(:sharable_type => model.class.name, :sharable_id => model.id).destroy
|
32
|
+
model.inc(:shares_count, -1)
|
33
|
+
|
34
|
+
model.before_unshare_by(self) if model.respond_to?('before_unshare_by')
|
35
|
+
model.after_unshare_by(self) if model.respond_to?('after_unshare_by')
|
36
|
+
self.before_unshare(model) if self.respond_to?('before_unshare')
|
37
|
+
self.after_unshare(model) if self.respond_to?('after_unshare')
|
38
|
+
return true
|
39
|
+
else
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# know if user is already shared model
|
45
|
+
#
|
46
|
+
# Example:
|
47
|
+
# => @john.shared?(@photo)
|
48
|
+
# => true
|
49
|
+
def shared?(model)
|
50
|
+
shares.where(sharable_type: model.class.name, sharable_id: model.id).exists?
|
51
|
+
end
|
52
|
+
|
53
|
+
# get likes count by model
|
54
|
+
#
|
55
|
+
# Example:
|
56
|
+
# => @john.shares_count_by_model("Photo")
|
57
|
+
# => 1
|
58
|
+
def shares_count_by_model(model)
|
59
|
+
self.shares.where(:sharable_type => model).count
|
60
|
+
end
|
61
|
+
|
62
|
+
# view all selfs shares
|
63
|
+
#
|
64
|
+
# Example:
|
65
|
+
# => @john.liked_objects
|
66
|
+
# => [@photo]
|
67
|
+
def shared_objects
|
68
|
+
get_shared_objects_of_kind
|
69
|
+
end
|
70
|
+
|
71
|
+
# view all selfs likes by model
|
72
|
+
#
|
73
|
+
# Example:
|
74
|
+
# => @john.get_shared_objects_of_kind('Photo')
|
75
|
+
# => [@photo]
|
76
|
+
def get_shared_objects_of_kind(model = nil)
|
77
|
+
if model
|
78
|
+
user_shares = shares.where(sharable_type: model)
|
79
|
+
extract_shares_from(user_shares, model)
|
80
|
+
else
|
81
|
+
sharable_types = shares.map(&:sharable_type).uniq
|
82
|
+
sharable_types.collect do |sharable_type|
|
83
|
+
user_shares = shares.select{ |share| share.sharable_type == sharable_type }
|
84
|
+
extract_shares_from(user_likes, likable_type)
|
85
|
+
end.flatten
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def extract_shares_from(user_shares, sharable_type)
|
90
|
+
return [] unless user_shares.present?
|
91
|
+
sharable_ids = user_shares.map(&:sharable_id)
|
92
|
+
sharable_type.constantize.find(sharable_ids)
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def method_missing(missing_method, *args, &block)
|
98
|
+
if missing_method.to_s =~ /^(.+)_shares_count$/
|
99
|
+
shares_count_by_model($1.camelize)
|
100
|
+
elsif missing_method.to_s =~ /^shared_(.+)$/
|
101
|
+
get_shared_objects_of_kind($1.singularize.camelize)
|
102
|
+
else
|
103
|
+
super
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -5,4 +5,8 @@ require 'models/like'
|
|
5
5
|
|
6
6
|
require 'mongoid_socializer_actions/commentable'
|
7
7
|
require 'mongoid_socializer_actions/commenter'
|
8
|
-
require 'models/comment'
|
8
|
+
require 'models/comment'
|
9
|
+
|
10
|
+
require 'mongoid_socializer_actions/sharable'
|
11
|
+
require 'mongoid_socializer_actions/sharer'
|
12
|
+
require 'models/share'
|
data/spec/mongoid/models/user.rb
CHANGED
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Mongoid::Sharer do
|
4
|
+
describe User do
|
5
|
+
before :each do
|
6
|
+
@john = User.create(name: 'john')
|
7
|
+
@jashua = User.create(name: 'jashua')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have no shares" do
|
11
|
+
[@john, @jashua].each {|u| u.shared_objects.should be_empty}
|
12
|
+
end
|
13
|
+
|
14
|
+
describe Photo do
|
15
|
+
before :each do
|
16
|
+
@photo1 = Photo.create
|
17
|
+
@photo2 = Photo.create
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should have no shares" do
|
21
|
+
[@photo1, @photo2].each { |p| p.shares.should be_empty }
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should be sharable" do
|
25
|
+
expect{ @john.share(@photo1) }.to change(Mongoid::Share, :count).by(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be shared by sharer" do
|
29
|
+
@john.share(@photo1)
|
30
|
+
@john.shared?(@photo1).should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be unshared by sharer" do
|
34
|
+
@john.share(@photo1)
|
35
|
+
@john.unshare(@photo1)
|
36
|
+
@john.shared?(@photo1).should be_false
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have the liker as sharer" do
|
40
|
+
@john.share(@photo1)
|
41
|
+
@photo1.sharers.should include @john
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not have others as sharer" do
|
45
|
+
@photo1.sharers.should_not include @jashua
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be increase likes_count" do
|
49
|
+
expect{ @jashua.share(@photo1) }.to change(@photo1, :shares_count).by(1)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be shared by multiple sharers" do
|
53
|
+
@jashua.share(@photo1)
|
54
|
+
@john.share(@photo1)
|
55
|
+
@photo1.sharers.should include @john, @jashua
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have the correct sharers count" do
|
59
|
+
@jashua.share(@photo1)
|
60
|
+
@john.share(@photo1)
|
61
|
+
@photo1.shares_count.should be 2
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be unsharable" do
|
65
|
+
@jashua.share(@photo1)
|
66
|
+
@jashua.unshare(@photo1).should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not be unsharable by shere" do
|
70
|
+
@jashua.unshare(@photo1).should be_false
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should not include former liker" do
|
74
|
+
@photo1.sharers.should_not include @jashua
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should not be included in former likes" do
|
78
|
+
@jashua.shared_objects.should_not include @photo1
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "get likes by model" do
|
83
|
+
before :each do
|
84
|
+
@photo1 = Photo.create
|
85
|
+
@photo2 = Photo.create
|
86
|
+
@album1 = Album.create
|
87
|
+
@album2 = Album.create
|
88
|
+
@john.share(@photo1)
|
89
|
+
@john.share(@photo2)
|
90
|
+
@john.share(@album1)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should return photo likes count" do
|
94
|
+
@john.photo_shares_count.should == 2
|
95
|
+
@john.album_shares_count.should == 1
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return liked photos " do
|
99
|
+
@john.shared_photos.should == [@photo1, @photo2]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,7 +11,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
11
11
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
12
12
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'app'))
|
13
13
|
|
14
|
-
Mongoid.load! '/Users/sreehari/MyProjects/
|
14
|
+
Mongoid.load! '/Users/sreehari/MyProjects/mongoid_socializer_actions/spec/config/mongoid.yml', :test
|
15
15
|
|
16
16
|
require 'mongoid_socializer_actions'
|
17
17
|
require 'rspec'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_socializer_actions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2013-02-11 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
16
|
-
requirement: &
|
16
|
+
requirement: &2160400880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2160400880
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
requirement: &
|
27
|
+
requirement: &2160398860 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '3.2'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2160398860
|
36
36
|
description: Add liking, commentable, sharabel, tagabel ability to Mongoid documents.
|
37
37
|
email:
|
38
38
|
- sreehari@activesphere.com
|
@@ -48,12 +48,15 @@ files:
|
|
48
48
|
- Readme.md
|
49
49
|
- app/models/comment.rb
|
50
50
|
- app/models/like.rb
|
51
|
+
- app/models/share.rb
|
51
52
|
- lib/mongoid_socializer_actions.rb
|
52
53
|
- lib/mongoid_socializer_actions/commentable.rb
|
53
54
|
- lib/mongoid_socializer_actions/commenter.rb
|
54
55
|
- lib/mongoid_socializer_actions/helper.rb
|
55
56
|
- lib/mongoid_socializer_actions/likeable.rb
|
56
57
|
- lib/mongoid_socializer_actions/liker.rb
|
58
|
+
- lib/mongoid_socializer_actions/sharable.rb
|
59
|
+
- lib/mongoid_socializer_actions/sharer.rb
|
57
60
|
- lib/mongoid_socializer_actions/version.rb
|
58
61
|
- mongoid_socializer_actions.gemspec
|
59
62
|
- spec/config/mongoid.yml
|
@@ -62,6 +65,7 @@ files:
|
|
62
65
|
- spec/mongoid/models/user.rb
|
63
66
|
- spec/mongoid/mongoid_socializer_actions/comments_spec.rb
|
64
67
|
- spec/mongoid/mongoid_socializer_actions/likes_spec.rb
|
68
|
+
- spec/mongoid/mongoid_socializer_actions/shares_spec.rb
|
65
69
|
- spec/spec_helper.rb
|
66
70
|
homepage: https://github.com/sreehari/mongoid_socializer_actions
|
67
71
|
licenses: []
|
@@ -95,4 +99,5 @@ test_files:
|
|
95
99
|
- spec/mongoid/models/user.rb
|
96
100
|
- spec/mongoid/mongoid_socializer_actions/comments_spec.rb
|
97
101
|
- spec/mongoid/mongoid_socializer_actions/likes_spec.rb
|
102
|
+
- spec/mongoid/mongoid_socializer_actions/shares_spec.rb
|
98
103
|
- spec/spec_helper.rb
|