subscribable 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/generators/subscribable/templates/sub_relation_migration.rb +0 -1
- data/lib/subscribable/relation_assigner.rb +8 -54
- data/lib/subscribable/version.rb +1 -1
- data/spec/fake_models/{actor.rb → group.rb} +1 -1
- data/spec/fake_models/user.rb +7 -0
- data/spec/relationship_spec.rb +88 -0
- data/spec/spec_helper.rb +9 -4
- data/subscribable.gemspec +1 -1
- metadata +9 -9
- data/spec/actor_spec.rb +0 -108
- data/spec/relation_assigner_spec.rb +0 -24
@@ -16,6 +16,14 @@ module Subscribable
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def subscribers_from(*args)
|
20
|
+
subscribers.where(subscriber_type: args)
|
21
|
+
end
|
22
|
+
|
23
|
+
def subscriptions_to(*args)
|
24
|
+
subscriptions.where(subscription_type: args)
|
25
|
+
end
|
26
|
+
|
19
27
|
def subscribe_to!(actor)
|
20
28
|
sub = subscriptions.new
|
21
29
|
sub.subscription = actor
|
@@ -27,66 +35,12 @@ module Subscribable
|
|
27
35
|
subscription.delete
|
28
36
|
end
|
29
37
|
|
30
|
-
def subscription_status_with(actor)
|
31
|
-
subscription = subscription_with(actor)
|
32
|
-
subscription.nil? ? 'no relationship' : subscription.status
|
33
|
-
end
|
34
|
-
|
35
|
-
def update_subscription_status!(actor, status)
|
36
|
-
subscription = subscription_with(actor)
|
37
|
-
subscription.status = status
|
38
|
-
subscription.save
|
39
|
-
end
|
40
|
-
|
41
38
|
def subscribed_to?(actor)
|
42
39
|
query = actor.subscribers.where(subscriber_id: id, subscriber_type: self.class.name)
|
43
40
|
query.empty? ? false : true
|
44
41
|
end
|
45
42
|
|
46
|
-
def respond_to?(method_name, include_all=false)
|
47
|
-
class_name = klass_name(method_name)
|
48
|
-
method_name.to_s.match('_subscri') ? class_name.constantize.respond_to?(:subscribable?) : super
|
49
|
-
end
|
50
|
-
|
51
|
-
def method_missing(method_name, *args, &block)
|
52
|
-
class_name = klass_name(method_name)
|
53
|
-
case method_name.to_s
|
54
|
-
when /_subscribers/
|
55
|
-
subscribers_query(method_name, class_name)
|
56
|
-
when /_subscriptions/
|
57
|
-
subscriptions_query(method_name, class_name)
|
58
|
-
else
|
59
|
-
super
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
43
|
private
|
64
|
-
def klass_name(value)
|
65
|
-
value = value.to_s.split('_')
|
66
|
-
value.pop
|
67
|
-
value.map{|name| name.capitalize}.join
|
68
|
-
end
|
69
|
-
|
70
|
-
def subscriptions_query(method_name, class_name)
|
71
|
-
self.class.send(:define_method, method_name) do
|
72
|
-
Subscribable::SubRelation.where(
|
73
|
-
subscriber_id: self.id,
|
74
|
-
subscriber_type: self.class.name,
|
75
|
-
subscription_type: class_name )
|
76
|
-
end
|
77
|
-
self.send(method_name)
|
78
|
-
end
|
79
|
-
|
80
|
-
def subscribers_query(method_name, class_name)
|
81
|
-
self.class.send(:define_method, method_name) do
|
82
|
-
Subscribable::SubRelation.where(
|
83
|
-
subscription_type: self.class.name,
|
84
|
-
subscription_id: self.id,
|
85
|
-
subscriber_type: class_name )
|
86
|
-
end
|
87
|
-
self.send(method_name)
|
88
|
-
end
|
89
|
-
|
90
44
|
def subscription_with(actor)
|
91
45
|
subscriptions.where(subscription_id: actor.id, subscription_type: actor.class.name).first
|
92
46
|
end
|
data/lib/subscribable/version.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'User - Group Relationship' do
|
4
|
+
let(:user) { User.create(name: 'Marius') }
|
5
|
+
let(:group) { Group.create(name: 'Calculus') }
|
6
|
+
|
7
|
+
it 'group is subscribable' do
|
8
|
+
expect( Group.subscribable? ).to be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'user is subscribable' do
|
12
|
+
expect( User.subscribable? ).to be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'user can subscribe to another user' do
|
16
|
+
user.subscribe_to!(user)
|
17
|
+
expect(user.subscribers.size).to eq(1)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'group can subscribe to another group' do
|
21
|
+
group.subscribe_to!(group)
|
22
|
+
expect(group.subscribers.size).to eq(1)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'uniqueness' do
|
26
|
+
it 'allows saving subscribable' do
|
27
|
+
sub = user.subscriptions.new
|
28
|
+
sub.subscriber = group
|
29
|
+
expect{ sub.save}.to_not raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'does not allow to save duplicate subscribable' do
|
33
|
+
sub = user.subscriptions.new
|
34
|
+
sub.subscription = group
|
35
|
+
sub.save
|
36
|
+
|
37
|
+
sub2 = user.subscriptions.new
|
38
|
+
sub2.subscription = group
|
39
|
+
expect{ sub2.save }.to raise_error(ActiveRecord::RecordNotUnique)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'subscribed_to?' do
|
44
|
+
it 'returns true if user is subscribed to group' do
|
45
|
+
sub = user.subscriptions.new
|
46
|
+
sub.subscription = group
|
47
|
+
sub.save
|
48
|
+
expect(user.subscribed_to?(group)).to be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns false if user is not subscribed to group' do
|
52
|
+
expect(user.subscribed_to?(group)).to be_false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'can delete a subscription to a group' do
|
57
|
+
user.subscribe_to!(group)
|
58
|
+
user.delete_subscription_to!(group)
|
59
|
+
expect(user.subscribed_to?(group)).to be_false
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'subscribers' do
|
63
|
+
it 'can search by type' do
|
64
|
+
group.subscribe_to!(user)
|
65
|
+
user.subscribe_to!(user)
|
66
|
+
expect(user.subscribers_from('Group').size).to eq(1)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'can search by many types' do
|
70
|
+
group.subscribe_to!(user)
|
71
|
+
user.subscribe_to!(user)
|
72
|
+
expect(user.subscribers_from('User', 'Group').size).to eq(2)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'subscriptions' do
|
77
|
+
it 'can search by type' do
|
78
|
+
user.subscribe_to!(group)
|
79
|
+
user.subscribe_to!(user)
|
80
|
+
expect(user.subscriptions_to('Group').size).to eq(1)
|
81
|
+
end
|
82
|
+
it 'can search by many type' do
|
83
|
+
user.subscribe_to!(group)
|
84
|
+
user.subscribe_to!(user)
|
85
|
+
expect(user.subscriptions_to('Group', 'User').size).to eq(2)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'active_record'
|
4
|
+
require 'fake_models/user'
|
5
|
+
require 'fake_models/group'
|
4
6
|
|
5
7
|
RSpec.configure do |config|
|
6
8
|
end
|
@@ -10,16 +12,19 @@ ActiveRecord::Base.establish_connection(
|
|
10
12
|
:database => ":memory:"
|
11
13
|
)
|
12
14
|
|
13
|
-
class
|
15
|
+
class CreateModels < ActiveRecord::Migration
|
14
16
|
def self.up
|
15
|
-
create_table :
|
17
|
+
create_table :users do |t|
|
18
|
+
t.string :name
|
19
|
+
end
|
20
|
+
|
21
|
+
create_table :groups do |t|
|
16
22
|
t.string :name
|
17
23
|
end
|
18
24
|
|
19
25
|
create_table :sub_relations do |t|
|
20
26
|
t.references :subscription, polymorphic: true
|
21
27
|
t.references :subscriber, polymorphic: true
|
22
|
-
t.string :status
|
23
28
|
t.timestamps
|
24
29
|
end
|
25
30
|
|
@@ -30,4 +35,4 @@ class CreateActors < ActiveRecord::Migration
|
|
30
35
|
end
|
31
36
|
end
|
32
37
|
|
33
|
-
catch_output =
|
38
|
+
catch_output = CreateModels.up
|
data/subscribable.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["marius@mlpinit.com"]
|
11
11
|
spec.description = %q{ Groups, Users, or other models can subscribe to each other.}
|
12
12
|
spec.summary = %q{ A way models can subscribe to each other.}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/mlpinit/subscribable"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subscribable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -78,12 +78,12 @@ files:
|
|
78
78
|
- lib/subscribable/relation_assigner.rb
|
79
79
|
- lib/subscribable/sub_relation.rb
|
80
80
|
- lib/subscribable/version.rb
|
81
|
-
- spec/
|
82
|
-
- spec/fake_models/
|
83
|
-
- spec/
|
81
|
+
- spec/fake_models/group.rb
|
82
|
+
- spec/fake_models/user.rb
|
83
|
+
- spec/relationship_spec.rb
|
84
84
|
- spec/spec_helper.rb
|
85
85
|
- subscribable.gemspec
|
86
|
-
homepage:
|
86
|
+
homepage: https://github.com/mlpinit/subscribable
|
87
87
|
licenses:
|
88
88
|
- MIT
|
89
89
|
post_install_message:
|
@@ -109,8 +109,8 @@ signing_key:
|
|
109
109
|
specification_version: 3
|
110
110
|
summary: A way models can subscribe to each other.
|
111
111
|
test_files:
|
112
|
-
- spec/
|
113
|
-
- spec/fake_models/
|
114
|
-
- spec/
|
112
|
+
- spec/fake_models/group.rb
|
113
|
+
- spec/fake_models/user.rb
|
114
|
+
- spec/relationship_spec.rb
|
115
115
|
- spec/spec_helper.rb
|
116
116
|
has_rdoc:
|
data/spec/actor_spec.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fake_models/actor'
|
3
|
-
|
4
|
-
describe 'Actor' do
|
5
|
-
let(:actor) { Actor.create!(name: 'George') }
|
6
|
-
let(:star) { Actor.create!(name: 'Mike') }
|
7
|
-
|
8
|
-
it 'responds to actor_subscribers' do
|
9
|
-
expect( actor.respond_to?(:actor_subscribers) ).to be_true
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'responds to actor_subscriptions' do
|
13
|
-
expect( actor.respond_to?(:actor_subscriptions) ).to be_true
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'can call actor_subscribers' do
|
17
|
-
expect( actor.actor_subscribers ).to eq([])
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'can call actor_subscriptions' do
|
21
|
-
expect( actor.actor_subscriptions ).to eq([])
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'has subscriptions' do
|
25
|
-
expect{ actor.subscriptions }.to_not raise_error(NoMethodError)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'has subscribers' do
|
29
|
-
expect{ actor.subscribers }.to_not raise_error(NoMethodError)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'is subscribable' do
|
33
|
-
expect( Actor.subscribable? ).to be_true
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'subscribe(actor) subscribes to an actor' do
|
37
|
-
star.subscribe_to!(actor)
|
38
|
-
expect(actor.subscribers.size).to eq(1)
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'existance of relationship' do
|
42
|
-
it 'subscribed_to?(actor) returns true' do
|
43
|
-
sub = star.subscriptions.new
|
44
|
-
sub.subscription = actor
|
45
|
-
sub.save
|
46
|
-
expect(star.subscribed_to?(actor)).to be_true
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'subscribed_to?(actor) returns false' do
|
50
|
-
expect(star.subscribed_to?(actor)).to be_false
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'without sub_relations' do
|
55
|
-
it 'can query subscribers from subscribable models' do
|
56
|
-
expect( actor.actor_subscribers ).to eq([])
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'can query subscriptions from subscribable models' do
|
60
|
-
expect( actor.actor_subscriptions ).to eq([])
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'with sub_relations' do
|
65
|
-
before do
|
66
|
-
sub = actor.subscriptions.new
|
67
|
-
sub.subscription = star
|
68
|
-
sub.save
|
69
|
-
end
|
70
|
-
it 'can query subscriptions from subscribable models' do
|
71
|
-
expect( actor.actor_subscriptions.size ).to eq(1)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'can query subscribers from subscribable models' do
|
75
|
-
expect( star.actor_subscribers.size ).to eq(1)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'relationship status' do
|
80
|
-
it 'has no relationship' do
|
81
|
-
expect( star.subscription_status_with(actor) ).to eq('no relationship')
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'has friendship relationship' do
|
85
|
-
sub = star.subscriptions.new
|
86
|
-
sub.subscription = actor
|
87
|
-
sub.status = 'friendship'
|
88
|
-
sub.save
|
89
|
-
expect( star.subscription_status_with(actor) ).to eq('friendship')
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'updates subscription status' do
|
94
|
-
sub = star.subscriptions.new
|
95
|
-
sub.subscription = actor
|
96
|
-
sub.status = 'pending'
|
97
|
-
sub.save
|
98
|
-
star.update_subscription_status!(actor, 'friendship')
|
99
|
-
sub = star.subscriptions.where(subscription_id: actor.id, subscription_type: actor.class.name).first
|
100
|
-
expect(sub.status).to eq('friendship')
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'delete subscription to actor' do
|
104
|
-
star.subscribe_to!(actor)
|
105
|
-
star.delete_subscription_to!(actor)
|
106
|
-
expect(star.subscribed_to?(actor)).to be_false
|
107
|
-
end
|
108
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fake_models/actor'
|
3
|
-
|
4
|
-
describe 'Relation Assigner' do
|
5
|
-
|
6
|
-
let(:actor) { Actor.create(name: 'Marius') }
|
7
|
-
let(:actor2) { Actor.create(name: 'Quad') }
|
8
|
-
|
9
|
-
it 'allows saving subscribable models' do
|
10
|
-
sub = actor.subscriptions.new
|
11
|
-
sub.subscriber = actor2
|
12
|
-
expect{ sub.save}.to_not raise_error
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'allows saving unique subscribable models only' do
|
16
|
-
sub = actor.subscriptions.new
|
17
|
-
sub.subscription = actor2
|
18
|
-
sub.save
|
19
|
-
|
20
|
-
sub2 = actor.subscriptions.new
|
21
|
-
sub2.subscription = actor2
|
22
|
-
expect{ sub2.save }.to raise_error(ActiveRecord::RecordNotUnique)
|
23
|
-
end
|
24
|
-
end
|