amico 2.3.1 → 2.3.2
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/.rspec +2 -1
- data/CHANGELOG.md +4 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/lib/amico/relationships.rb +44 -44
- data/lib/amico/version.rb +1 -1
- data/spec/amico/relationships_spec.rb +17 -6
- data/spec/amico/version_spec.rb +1 -1
- metadata +8 -2
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.3.2 (2013-01-04)
|
4
|
+
|
5
|
+
* Fixed an issue where the call to `reciprocated?` in the internal method `add_following_followers_reciprocated` was not passing along the scope.
|
6
|
+
|
3
7
|
## 2.3.1 (2012-09-13)
|
4
8
|
|
5
9
|
* Wrapped a few operations in Redis multi/exec blocks to be consistent with the rest of the library.
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
data/lib/amico/relationships.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Amico
|
2
2
|
module Relationships
|
3
|
-
# Establish a follow relationship between two IDs. After adding the follow
|
4
|
-
# relationship, it checks to see if the relationship is reciprocated and establishes that
|
3
|
+
# Establish a follow relationship between two IDs. After adding the follow
|
4
|
+
# relationship, it checks to see if the relationship is reciprocated and establishes that
|
5
5
|
# relationship if so.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# @param from_id [String] The ID of the individual establishing the follow relationship.
|
8
8
|
# @param to_id [String] The ID of the individual to be followed.
|
9
9
|
# @param scope [String] Scope for the call.
|
@@ -16,24 +16,24 @@ module Amico
|
|
16
16
|
return if blocked?(to_id, from_id, scope)
|
17
17
|
return if Amico.pending_follow && pending?(from_id, to_id, scope)
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Amico.redis.zadd("#{Amico.namespace}:#{Amico.pending_key}:#{scope}:#{to_id}", Time.now.to_i, from_id)
|
24
|
-
Amico.redis.zadd("#{Amico.namespace}:#{Amico.pending_with_key}:#{scope}:#{from_id}", Time.now.to_i, to_id)
|
19
|
+
if Amico.pending_follow
|
20
|
+
Amico.redis.multi do |transaction|
|
21
|
+
transaction.zadd("#{Amico.namespace}:#{Amico.pending_key}:#{scope}:#{to_id}", Time.now.to_i, from_id)
|
22
|
+
transaction.zadd("#{Amico.namespace}:#{Amico.pending_with_key}:#{scope}:#{from_id}", Time.now.to_i, to_id)
|
25
23
|
end
|
24
|
+
else
|
25
|
+
add_following_followers_reciprocated(from_id, to_id, scope)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
# Remove a follow relationship between two IDs. After removing the follow
|
30
|
-
# relationship, if a reciprocated relationship was established, it is
|
29
|
+
# Remove a follow relationship between two IDs. After removing the follow
|
30
|
+
# relationship, if a reciprocated relationship was established, it is
|
31
31
|
# also removed.
|
32
32
|
#
|
33
33
|
# @param from_id [String] The ID of the individual removing the follow relationship.
|
34
34
|
# @param to_id [String] The ID of the individual to be unfollowed.
|
35
35
|
# @param scope [String] Scope for the call.
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# Examples
|
38
38
|
#
|
39
39
|
# Amico.follow(1, 11)
|
@@ -49,10 +49,10 @@ module Amico
|
|
49
49
|
Amico.redis.zrem("#{Amico.namespace}:#{Amico.pending_key}:#{scope}:#{to_id}", from_id)
|
50
50
|
Amico.redis.zrem("#{Amico.namespace}:#{Amico.pending_with_key}:#{scope}:#{from_id}", to_id)
|
51
51
|
end
|
52
|
-
end
|
52
|
+
end
|
53
53
|
|
54
|
-
# Block a relationship between two IDs. This method also has the side effect
|
55
|
-
# of removing any follower or following relationship between the two IDs.
|
54
|
+
# Block a relationship between two IDs. This method also has the side effect
|
55
|
+
# of removing any follower or following relationship between the two IDs.
|
56
56
|
#
|
57
57
|
# @param from_id [String] The ID of the individual blocking the relationship.
|
58
58
|
# @param to_id [String] The ID of the individual being blocked.
|
@@ -83,9 +83,9 @@ module Amico
|
|
83
83
|
# @param from_id [String] The ID of the individual unblocking the relationship.
|
84
84
|
# @param to_id [String] The ID of the blocked individual.
|
85
85
|
# @param scope [String] Scope for the call.
|
86
|
-
#
|
86
|
+
#
|
87
87
|
# Examples
|
88
|
-
#
|
88
|
+
#
|
89
89
|
# Amico.block(1, 11)
|
90
90
|
# Amico.unblock(1, 11)
|
91
91
|
def unblock(from_id, to_id, scope = Amico.default_scope_key)
|
@@ -117,11 +117,11 @@ module Amico
|
|
117
117
|
end
|
118
118
|
|
119
119
|
# Deny a relationship that is pending between two IDs.
|
120
|
-
#
|
120
|
+
#
|
121
121
|
# @param from_id [String] The ID of the individual denying the relationship.
|
122
122
|
# @param to_id [String] The ID of the individual to be denied.
|
123
123
|
# @param scope [String] Scope for the call.
|
124
|
-
#
|
124
|
+
#
|
125
125
|
# Example
|
126
126
|
#
|
127
127
|
# Amico.follow(1, 11)
|
@@ -140,12 +140,12 @@ module Amico
|
|
140
140
|
|
141
141
|
# Clears all relationships (in either direction) stored for an individual.
|
142
142
|
# Helpful to prevent orphaned associations when deleting users.
|
143
|
-
#
|
143
|
+
#
|
144
144
|
# @param id [String] ID of the individual to clear info for.
|
145
145
|
# @param scope [String] Scope for the call.
|
146
|
-
#
|
146
|
+
#
|
147
147
|
# Examples
|
148
|
-
#
|
148
|
+
#
|
149
149
|
# Amico.follow(1, 11)
|
150
150
|
# Amico.followers_count(11) => 1
|
151
151
|
# Amico.clear(1)
|
@@ -167,9 +167,9 @@ module Amico
|
|
167
167
|
#
|
168
168
|
# @param id [String] ID of the individual to retrieve following count for.
|
169
169
|
# @param scope [String] Scope for the call.
|
170
|
-
#
|
170
|
+
#
|
171
171
|
# Examples
|
172
|
-
#
|
172
|
+
#
|
173
173
|
# Amico.follow(1, 11)
|
174
174
|
# Amico.following_count(1)
|
175
175
|
#
|
@@ -187,7 +187,7 @@ module Amico
|
|
187
187
|
#
|
188
188
|
# Amico.follow(11, 1)
|
189
189
|
# Amico.followers_count(1)
|
190
|
-
#
|
190
|
+
#
|
191
191
|
# @return the count of the number of individuals that are following someone.
|
192
192
|
def followers_count(id, scope = Amico.default_scope_key)
|
193
193
|
Amico.redis.zcard("#{Amico.namespace}:#{Amico.followers_key}:#{scope}:#{id}")
|
@@ -197,7 +197,7 @@ module Amico
|
|
197
197
|
#
|
198
198
|
# @param id [String] ID of the individual to retrieve blocked count for.
|
199
199
|
# @param scope [String] Scope for the call.
|
200
|
-
#
|
200
|
+
#
|
201
201
|
# Examples
|
202
202
|
#
|
203
203
|
# Amico.block(1, 11)
|
@@ -212,7 +212,7 @@ module Amico
|
|
212
212
|
#
|
213
213
|
# @param id [String] ID of the individual to retrieve blocked_by count for.
|
214
214
|
# @param scope [String] Scope for the call.
|
215
|
-
#
|
215
|
+
#
|
216
216
|
# Examples
|
217
217
|
#
|
218
218
|
# Amico.block(1, 11)
|
@@ -227,9 +227,9 @@ module Amico
|
|
227
227
|
#
|
228
228
|
# @param id [String] ID of the individual to retrieve reciprocated following count for.
|
229
229
|
# @param scope [String] Scope for the call.
|
230
|
-
#
|
230
|
+
#
|
231
231
|
# Examples
|
232
|
-
#
|
232
|
+
#
|
233
233
|
# Amico.follow(1, 11)
|
234
234
|
# Amico.follow(11, 1)
|
235
235
|
# Amico.reciprocated_count(1)
|
@@ -243,7 +243,7 @@ module Amico
|
|
243
243
|
#
|
244
244
|
# @param id [String] ID of the individual to retrieve pending count for.
|
245
245
|
# @param scope [String] Scope for the call.
|
246
|
-
#
|
246
|
+
#
|
247
247
|
# Examples
|
248
248
|
#
|
249
249
|
# Amico.follow(11, 1)
|
@@ -259,7 +259,7 @@ module Amico
|
|
259
259
|
#
|
260
260
|
# @param id [String] ID of the individual to retrieve pending count for.
|
261
261
|
# @param scope [String] Scope for the call.
|
262
|
-
#
|
262
|
+
#
|
263
263
|
# Examples
|
264
264
|
#
|
265
265
|
# Amico.follow(1, 11)
|
@@ -310,7 +310,7 @@ module Amico
|
|
310
310
|
# @param scope [String] Scope for the call.
|
311
311
|
#
|
312
312
|
# Examples
|
313
|
-
#
|
313
|
+
#
|
314
314
|
# Amico.block(1, 11)
|
315
315
|
# Amico.blocked?(1, 11)
|
316
316
|
#
|
@@ -326,7 +326,7 @@ module Amico
|
|
326
326
|
# @param scope [String] Scope for the call.
|
327
327
|
#
|
328
328
|
# Examples
|
329
|
-
#
|
329
|
+
#
|
330
330
|
# Amico.block(1, 11)
|
331
331
|
# Amico.blocked_by?(11, 1)
|
332
332
|
#
|
@@ -408,7 +408,7 @@ module Amico
|
|
408
408
|
# @param scope [String] Scope for the call.
|
409
409
|
#
|
410
410
|
# Examples
|
411
|
-
#
|
411
|
+
#
|
412
412
|
# Amico.follow(11, 1)
|
413
413
|
# Amico.follow(12, 1)
|
414
414
|
# Amico.followers(1, :page => 1)
|
@@ -550,7 +550,7 @@ module Amico
|
|
550
550
|
# Amico.block(1, 11)
|
551
551
|
# Amico.block(1, 12)
|
552
552
|
# Amico.blocked_page_count(1)
|
553
|
-
#
|
553
|
+
#
|
554
554
|
# @return the number of pages of blocked relationships for an individual.
|
555
555
|
def blocked_page_count(id, page_size = Amico.page_size, scope = Amico.default_scope_key)
|
556
556
|
total_pages("#{Amico.namespace}:#{Amico.blocked_key}:#{scope}:#{id}", page_size)
|
@@ -567,7 +567,7 @@ module Amico
|
|
567
567
|
# Amico.block(11, 1)
|
568
568
|
# Amico.block(12, 1)
|
569
569
|
# Amico.blocked_by_page_count(1)
|
570
|
-
#
|
570
|
+
#
|
571
571
|
# @return the number of pages of blocked_by relationships for an individual.
|
572
572
|
def blocked_by_page_count(id, page_size = Amico.page_size, scope = Amico.default_scope_key)
|
573
573
|
total_pages("#{Amico.namespace}:#{Amico.blocked_by_key}:#{scope}:#{id}", page_size)
|
@@ -586,7 +586,7 @@ module Amico
|
|
586
586
|
# Amico.follow(11, 1)
|
587
587
|
# Amico.follow(12, 1)
|
588
588
|
# Amico.reciprocated_page_count(1)
|
589
|
-
#
|
589
|
+
#
|
590
590
|
# @return the number of pages of reciprocated relationships for an individual.
|
591
591
|
def reciprocated_page_count(id, page_size = Amico.page_size, scope = Amico.default_scope_key)
|
592
592
|
total_pages("#{Amico.namespace}:#{Amico.reciprocated_key}:#{scope}:#{id}", page_size)
|
@@ -603,7 +603,7 @@ module Amico
|
|
603
603
|
# Amico.follow(11, 1)
|
604
604
|
# Amico.follow(12, 1)
|
605
605
|
# Amico.pending_page_count(1) # 1
|
606
|
-
#
|
606
|
+
#
|
607
607
|
# @return the number of pages of pending relationships for an individual.
|
608
608
|
def pending_page_count(id, page_size = Amico.page_size, scope = Amico.default_scope_key)
|
609
609
|
total_pages("#{Amico.namespace}:#{Amico.pending_key}:#{scope}:#{id}", page_size)
|
@@ -620,7 +620,7 @@ module Amico
|
|
620
620
|
# Amico.follow(1, 11)
|
621
621
|
# Amico.follow(1, 12)
|
622
622
|
# Amico.pending_with_page_count(1) # 1
|
623
|
-
#
|
623
|
+
#
|
624
624
|
# @return the number of pages of individuals waiting to approve another individual.
|
625
625
|
def pending_with_page_count(id, page_size = Amico.page_size, scope = Amico.default_scope_key)
|
626
626
|
total_pages("#{Amico.namespace}:#{Amico.pending_with_key}:#{scope}:#{id}", page_size)
|
@@ -668,7 +668,7 @@ module Amico
|
|
668
668
|
VALID_RELATIONSHIPS = [:following, :followers, :reciprocated, :blocked, :blocked_by, :pending, :pending_with]
|
669
669
|
|
670
670
|
# Ensure that a relationship type is valid.
|
671
|
-
#
|
671
|
+
#
|
672
672
|
# @param type [Symbol] One of :following, :followers, :reciprocated, :blocked, :blocked_by, :pending, :pending_with.
|
673
673
|
# @raise [StandardError] if the type is not included in VALID_RELATIONSHIPS
|
674
674
|
def validate_relationship_type(type)
|
@@ -682,11 +682,11 @@ module Amico
|
|
682
682
|
{:page_size => Amico.page_size, :page => 1}
|
683
683
|
end
|
684
684
|
|
685
|
-
# Add the following, followers and check for a reciprocated relationship. To be used from the
|
685
|
+
# Add the following, followers and check for a reciprocated relationship. To be used from the
|
686
686
|
# +follow+ and +accept+ methods.
|
687
687
|
#
|
688
688
|
# @param from_id [String] The ID of the individual establishing the follow relationship.
|
689
|
-
# @param to_id [String] The ID of the individual to be followed.
|
689
|
+
# @param to_id [String] The ID of the individual to be followed.
|
690
690
|
def add_following_followers_reciprocated(from_id, to_id, scope)
|
691
691
|
Amico.redis.multi do
|
692
692
|
Amico.redis.zadd("#{Amico.namespace}:#{Amico.following_key}:#{scope}:#{from_id}", Time.now.to_i, to_id)
|
@@ -695,12 +695,12 @@ module Amico
|
|
695
695
|
Amico.redis.zrem("#{Amico.namespace}:#{Amico.pending_with_key}:#{scope}:#{from_id}", to_id)
|
696
696
|
end
|
697
697
|
|
698
|
-
if reciprocated?(from_id, to_id)
|
698
|
+
if reciprocated?(from_id, to_id, scope)
|
699
699
|
Amico.redis.multi do
|
700
700
|
Amico.redis.zadd("#{Amico.namespace}:#{Amico.reciprocated_key}:#{scope}:#{from_id}", Time.now.to_i, to_id)
|
701
701
|
Amico.redis.zadd("#{Amico.namespace}:#{Amico.reciprocated_key}:#{scope}:#{to_id}", Time.now.to_i, from_id)
|
702
702
|
end
|
703
|
-
end
|
703
|
+
end
|
704
704
|
end
|
705
705
|
|
706
706
|
# Removes references to an individual in sets that are named with other individual's keys.
|
data/lib/amico/version.rb
CHANGED
@@ -138,6 +138,17 @@ describe Amico::Relationships do
|
|
138
138
|
Amico.follow(1, 11)
|
139
139
|
Amico.reciprocated?(1, 11).should be_false
|
140
140
|
end
|
141
|
+
|
142
|
+
it 'should respect scope when checking if a relationship is reciprocated' do
|
143
|
+
Amico.follow(1, 11, 'another_scope')
|
144
|
+
Amico.follow(11, 1, 'another_scope')
|
145
|
+
Amico.follow(1, 11, 'another_scope')
|
146
|
+
Amico.reciprocated?(1, 11).should be_false
|
147
|
+
Amico.reciprocated?(1, 11, 'another_scope').should be_true
|
148
|
+
Amico.follow(1, 11)
|
149
|
+
Amico.follow(11, 1)
|
150
|
+
Amico.reciprocated?(1, 11).should be_true
|
151
|
+
end
|
141
152
|
end
|
142
153
|
|
143
154
|
describe '#following' do
|
@@ -388,9 +399,9 @@ describe Amico::Relationships do
|
|
388
399
|
Amico.follow(1, 11)
|
389
400
|
Amico.pending?(1, 11).should be_true
|
390
401
|
Amico.pending_with?(11, 1).should be_true
|
391
|
-
|
402
|
+
|
392
403
|
Amico.deny(1, 11)
|
393
|
-
|
404
|
+
|
394
405
|
Amico.following?(1, 11).should be_false
|
395
406
|
Amico.pending?(1, 11).should be_false
|
396
407
|
Amico.pending_with?(11, 1).should be_false
|
@@ -630,16 +641,16 @@ describe Amico::Relationships do
|
|
630
641
|
it 'should remove follower/following relationships' do
|
631
642
|
Amico.follow(1, 11)
|
632
643
|
Amico.follow(11, 1)
|
633
|
-
|
644
|
+
|
634
645
|
Amico.following_count(1).should be(1)
|
635
646
|
Amico.followers_count(1).should be(1)
|
636
647
|
Amico.reciprocated_count(1).should be(1)
|
637
648
|
Amico.following_count(11).should be(1)
|
638
649
|
Amico.followers_count(11).should be(1)
|
639
650
|
Amico.reciprocated_count(11).should be(1)
|
640
|
-
|
651
|
+
|
641
652
|
Amico.clear(1)
|
642
|
-
|
653
|
+
|
643
654
|
Amico.following_count(1).should be(0)
|
644
655
|
Amico.followers_count(1).should be(0)
|
645
656
|
Amico.reciprocated_count(1).should be(0)
|
@@ -657,7 +668,7 @@ describe Amico::Relationships do
|
|
657
668
|
Amico.pending_count(11).should be(0)
|
658
669
|
Amico.pending_follow = previous_pending_value
|
659
670
|
end
|
660
|
-
|
671
|
+
|
661
672
|
it 'should clear blocked/blocked_by relationships' do
|
662
673
|
Amico.block(1, 11)
|
663
674
|
Amico.blocked_count(1).should be(1)
|
data/spec/amico/version_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amico
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.2
|
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:
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -95,12 +95,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
95
|
- - ! '>='
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
hash: -1960830450408836272
|
98
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
102
|
none: false
|
100
103
|
requirements:
|
101
104
|
- - ! '>='
|
102
105
|
- !ruby/object:Gem::Version
|
103
106
|
version: '0'
|
107
|
+
segments:
|
108
|
+
- 0
|
109
|
+
hash: -1960830450408836272
|
104
110
|
requirements: []
|
105
111
|
rubyforge_project: amico
|
106
112
|
rubygems_version: 1.8.24
|