mongoid_socializer_actions 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|