rails-canhaz 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -63,8 +63,41 @@ class CanHazPermission < ActiveRecord::Base
63
63
  matching = results.find_all { |result| result.csubject_id == subject.id}.collect { |c| c.cobject_id }
64
64
  h[subject.id] = objects.find_all { |object| matching.include? object.id }
65
65
  end
66
-
67
66
  h
67
+ end
68
+
69
+ # Gets Permissions for a given object class, subject class, and permission name in an organized hash
70
+ #
71
+ # @param [Class] object The object class
72
+ # @param [Class] subject The subject class
73
+ # @param [String, Symbol] The name of the permission
74
+ def self.objects_and_subjects_from_permission(object, subject, permission)
75
+ raise CanHaz::Exceptions::NotACanHazObject unless object.include?(CanHaz::ModelExtensions::Object)
76
+ raise CanHaz::Exceptions::NotACanHazSubject unless subject.include?(CanHaz::ModelExtensions::Subject)
77
+
78
+ permissions = CanHazPermission.where(
79
+ :csubject_type => subject.to_s,
80
+ :cobject_type => object.to_s,
81
+ :permission_name => permission
82
+ )
83
+
84
+ permissions = yield(permissions) if block_given?
85
+
86
+ subjects = subject.find_all_by_id(permissions.collect(&:csubject_id)).inject({}) { |res, cur| res[cur.id] = cur; res} # Map by id for better access
87
+ objects = object.find_all_by_id(permissions.collect(&:cobject_id)).inject({}) { |res, cur| res[cur.id] = cur; res} # Map by id for better access
88
+
89
+ result = []
90
+
91
+ permissions.each do |permission|
92
+ found = result.find { |row| row[:subject] == subjects[permission.csubject_id]}
93
+ if found
94
+ found[:objects].push objects[permission.cobject_id]
95
+ else
96
+ result.push({:subject => subjects[permission.csubject_id], :objects => [objects[permission.cobject_id]]})
97
+ end
98
+ end
99
+
100
+ result
68
101
 
69
102
  end
70
103
 
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 = '1.0.5'
4
- s.date = '2012-11-07'
3
+ s.version = '1.0.6'
4
+ s.date = '2013-02-01'
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
@@ -270,5 +270,37 @@ class CanHazTest < Test::Unit::TestCase
270
270
  assert_equal false, s.can?(:foo)
271
271
  end
272
272
 
273
+ def test_objects_subjects_permission
274
+
275
+ s1 = SubjectModel.create!
276
+ s2 = SubjectModel.create!
277
+ o1 = ObjectModel.create!
278
+ o2 = ObjectModel.create!
279
+ o3 = ObjectModel.create!
280
+
281
+ s1.can!(:foo_osp, o1)
282
+ s1.can!(:foo_osp, o3)
283
+
284
+ s2.can!(:foo_osp, o1)
285
+ s2.can!(:foo_osp, o2)
286
+
287
+ res = CanHazPermission.objects_and_subjects_from_permission(ObjectModel, SubjectModel, :foo_osp)
288
+
289
+ assert_equal 2, res.count
290
+
291
+ subjects = Set.new(res.collect { |row| row[:subject] }) # Sets are unsorted arrays
292
+
293
+ assert_equal Set.new([s1, s2]), subjects # Both arrays contain the same values, independently of the order
294
+
295
+ objects = Set.new(res.find { |row| row[:subject] == s1 }[:objects])
296
+
297
+ assert_equal Set.new([o1, o3]), objects
298
+
299
+ objects = Set.new(res.find { |row| row[:subject] == s2 }[:objects])
300
+
301
+ assert_equal Set.new([o1, o2]), objects
302
+
303
+ end
304
+
273
305
  end
274
306
 
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: 1.0.5
4
+ version: 1.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-07 00:00:00.000000000 Z
12
+ date: 2013-02-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
+ prerelease: false
16
17
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.1.0
22
+ none: false
22
23
  type: :runtime
23
- prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
25
  requirements:
27
26
  - - ! '>='
28
27
  - !ruby/object:Gem::Version
29
28
  version: 3.1.0
29
+ none: false
30
30
  description: A simple gem for managing permissions between rails models
31
31
  email: adrien@siami.fr
32
32
  executables: []
@@ -61,17 +61,17 @@ rdoc_options: []
61
61
  require_paths:
62
62
  - lib
63
63
  required_ruby_version: !ruby/object:Gem::Requirement
64
- none: false
65
64
  requirements:
66
65
  - - ! '>='
67
66
  - !ruby/object:Gem::Version
68
67
  version: '0'
69
- required_rubygems_version: !ruby/object:Gem::Requirement
70
68
  none: false
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
70
  requirements:
72
71
  - - ! '>='
73
72
  - !ruby/object:Gem::Version
74
73
  version: '0'
74
+ none: false
75
75
  requirements: []
76
76
  rubyforge_project:
77
77
  rubygems_version: 1.8.24