subscribable 0.0.2 → 0.0.3
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/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
|