rails-canhaz 0.1.2 → 0.2.0

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.
@@ -24,4 +24,43 @@ class CanHazPermission < ActiveRecord::Base
24
24
  results.first
25
25
  end
26
26
 
27
+ # Gets the permissions for multiple subjects
28
+ #
29
+ # @param subjects [Array] an array of subjects
30
+ # @param permission [Hash, String] The identifier of the permission
31
+ # @param objects [Array] an array of objects
32
+ # @return [Hash] A Hash of permissions, the key is the id of the object, the value is an array of objects that match
33
+ def self.can?(subjects, permission, objects)
34
+
35
+ return {} if subjects.size == 0 or objects.size == 0
36
+
37
+ raise NotUniqueClasses if subjects.group_by { |s| s.class }.size > 1
38
+ raise NotUniqueClasses if objects.group_by { |s| s.class }.size > 1
39
+
40
+ subject_ids = subjects.collect { |s| s.id }
41
+ object_ids = objects.collect{ |o| o.id }
42
+
43
+ results = CanHazPermission.where(
44
+ [
45
+ 'csubject_id IN (?) AND cobject_id IN(?) AND csubject_type = ? AND cobject_type = ? AND permission_name = ?',
46
+ subject_ids,
47
+ object_ids,
48
+ subjects.first.class.to_s,
49
+ objects.first.class.to_s,
50
+ permission
51
+ ]
52
+ )
53
+
54
+ h = {}
55
+
56
+ subjects.each do |subject|
57
+ # Get the ids of the objects that matched
58
+ matching = results.find_all { |result| result.csubject_id == subject.id}.collect { |c| c.cobject_id }
59
+ h[subject.id] = objects.find_all { |object| matching.include? object.id }
60
+ end
61
+
62
+ h
63
+
64
+ end
65
+
27
66
  end
@@ -2,5 +2,6 @@ module CanHaz
2
2
  module Exceptions
3
3
  class NotACanHazSubject < StandardError; end
4
4
  class NotACanHazObject < StandardError; end
5
+ class NotUniqueClasses < StandardError; end
5
6
  end
6
7
  end
@@ -49,6 +49,11 @@ module CanHaz
49
49
  !self.can?(permission, object)
50
50
  end
51
51
 
52
+ # Removes all permissions on the current subject
53
+ def can_do_nothing
54
+ CanHazPermission.destroy_all(['csubject_id = ? AND csubject_type = ?', self.id, self.class.to_s])
55
+ end
56
+
52
57
  # Gets All objects that match a given type and permission
53
58
  #
54
59
  # @param type [Class] The type of the objects
data/rails-canhaz.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rails-canhaz'
3
- s.version = '0.1.2'
4
- s.date = '2012-04-16'
3
+ s.version = '0.2.0'
4
+ s.date = '2012-04-27'
5
5
  s.summary = "A simple gem for managing permissions between rails models"
6
6
  s.description = "A simple gem for managing permissions between rails models"
7
7
  s.authors = ["Adrien Siami (Intrepidd)"]
data/test/test_canhaz.rb CHANGED
@@ -151,5 +151,70 @@ class CanHazTest < Test::Unit::TestCase
151
151
 
152
152
  end
153
153
 
154
+
155
+ def test_drop_all
156
+ subject = SubjectModel.new
157
+ subject.save
158
+
159
+ subject2 = SubjectModel.new
160
+ subject2.save
161
+
162
+ object1 = ObjectModel.new
163
+ object1.save
164
+
165
+ object2 = ObjectModel.new
166
+ object2.save
167
+
168
+ subject.can(:foo, object1)
169
+ subject.can(:bar, object1)
170
+ subject.can(:foo, object2)
171
+ subject.can(:bar, object2)
172
+
173
+ subject2.can(:foo, object1)
174
+
175
+ subject.can_do_nothing
176
+
177
+ subject.reload
178
+
179
+ assert subject.cannot?(:foo, object1)
180
+ assert subject.cannot?(:bar, object1)
181
+ assert subject.cannot?(:foo, object2)
182
+ assert subject.cannot?(:bar, object2)
183
+
184
+ assert subject2.reload.can?(:foo, object1)
185
+
186
+ end
187
+
188
+ def test_multiple
189
+ s1 = SubjectModel.new
190
+ s2 = SubjectModel.new
191
+
192
+ o1 = ObjectModel.new
193
+ o2 = ObjectModel.new
194
+
195
+ s1.save
196
+ s2.save
197
+ o1.save
198
+ o2.save
199
+
200
+ s1.can(:foo, o1)
201
+ s1.can(:foo, o2)
202
+ s1.can(:bar, o2)
203
+
204
+ s2.can(:bar, o1)
205
+ s2.can(:foo, o2)
206
+
207
+ result = CanHazPermission.can?([s1, s2], :foo, [o1, o2])
208
+
209
+ assert result[s1.id] == [o1, o2]
210
+ assert result[s2.id] == [o2]
211
+
212
+ result = CanHazPermission.can?([s1, s2], :bar, [o1, o2])
213
+
214
+ assert result[s1.id] == [o2]
215
+ assert result[s2.id] == [o1]
216
+
217
+ end
218
+
154
219
  end
155
220
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-canhaz
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-16 00:00:00.000000000 Z
12
+ date: 2012-04-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &9336020 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,12 +21,7 @@ dependencies:
21
21
  version: 3.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: 3.1.0
24
+ version_requirements: *9336020
30
25
  description: A simple gem for managing permissions between rails models
31
26
  email: adrien@siami.fr
32
27
  executables: []
@@ -72,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
67
  version: '0'
73
68
  requirements: []
74
69
  rubyforge_project:
75
- rubygems_version: 1.8.23
70
+ rubygems_version: 1.8.11
76
71
  signing_key:
77
72
  specification_version: 3
78
73
  summary: A simple gem for managing permissions between rails models