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.
@@ -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