subscribable 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,6 @@ class CreateSubRelation < ActiveRecord::Migration
3
3
  create_table :sub_relations do |t|
4
4
  t.references :subscription, polymorphic: true
5
5
  t.references :subscriber, polymorphic: true
6
- t.string :status
7
6
  t.timestamps
8
7
  end
9
8
 
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Subscribable
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'active_record'
2
2
  require 'subscribable'
3
3
 
4
- class Actor < ActiveRecord::Base
4
+ class Group < ActiveRecord::Base
5
5
  include Subscribable::RelationAssigner
6
6
  subscribable
7
7
  end
@@ -0,0 +1,7 @@
1
+ require 'active_record'
2
+ require 'subscribable'
3
+
4
+ class User < ActiveRecord::Base
5
+ include Subscribable::RelationAssigner
6
+ subscribable
7
+ end
@@ -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 CreateActors < ActiveRecord::Migration
15
+ class CreateModels < ActiveRecord::Migration
14
16
  def self.up
15
- create_table :actors do |t|
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 = CreateActors.up
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.2
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-15 00:00:00.000000000 Z
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/actor_spec.rb
82
- - spec/fake_models/actor.rb
83
- - spec/relation_assigner_spec.rb
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/actor_spec.rb
113
- - spec/fake_models/actor.rb
114
- - spec/relation_assigner_spec.rb
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