rails-canhaz 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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