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.
- data/lib/rails-canhaz/canhaz_permission.rb +34 -1
- data/rails-canhaz.gemspec +2 -2
- data/test/test_canhaz.rb +32 -0
- metadata +7 -7
@@ -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.
|
4
|
-
s.date = '
|
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.
|
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:
|
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
|