rails-canhaz 1.0.5 → 1.0.6

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