rolify 4.1.1 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/CHANGELOG.rdoc +7 -0
- data/Gemfile +10 -1
- data/README.md +15 -1
- data/lib/rolify/adapters/active_record/role_adapter.rb +22 -0
- data/lib/rolify/adapters/mongoid/role_adapter.rb +22 -0
- data/lib/rolify/configure.rb +4 -2
- data/lib/rolify/dynamic.rb +1 -1
- data/lib/rolify/matchers.rb +2 -2
- data/lib/rolify/role.rb +9 -0
- data/lib/rolify/version.rb +1 -1
- data/rolify.gemspec +12 -6
- data/spec/common_helper.rb +16 -0
- data/spec/generators_helper.rb +9 -2
- data/spec/rolify/config_spec.rb +2 -0
- data/spec/rolify/custom_spec.rb +1 -1
- data/spec/rolify/resource_spec.rb +6 -0
- data/spec/rolify/shared_examples/shared_examples_for_has_role.rb +65 -0
- data/spec/spec_helper.rb +18 -4
- data/spec/support/adapters/active_record.rb +4 -3
- data/spec/support/adapters/mongoid.rb +19 -2
- data/spec/support/adapters/{mongoid.yml → mongoid_3.yml} +0 -0
- data/spec/support/adapters/mongoid_4.yml +6 -0
- data/spec/support/adapters/mongoid_5.yml +6 -0
- data/spec/support/adapters/utils/active_record.rb +12 -0
- data/spec/support/adapters/utils/mongoid.rb +13 -0
- metadata +29 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecd709c2e7e50d751a0161d8f0ab5b02ee5fd1aa
|
4
|
+
data.tar.gz: f0454a8410eba30cf7aff44ee27ffc70ee999182
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 350c0f03b4d1a7764fee723122aad166d38728dd0ebeed8b39b6cd1523f03bfeb3cc5ef40b813b8d37e84ab28a37088f59fabac7cf3271c34badc3910b77762b
|
7
|
+
data.tar.gz: dbfcaebac05d8b0dc0d5cdca10f847d84080e28ef08b2473c759cf7cc1eba4bcae80eea2bf77cc0cec3f180a3e43f04b029247b2d894fb68f34e2fed2f8dc3d2
|
data/.travis.yml
CHANGED
@@ -2,10 +2,10 @@ language: ruby
|
|
2
2
|
sudo: false
|
3
3
|
|
4
4
|
rvm:
|
5
|
+
- 2.2.3
|
5
6
|
- 2.2.2
|
6
7
|
- 2.1.2
|
7
8
|
- 2.0.0
|
8
|
-
|
9
9
|
|
10
10
|
before_install:
|
11
11
|
- gem update --system
|
@@ -16,7 +16,9 @@ script: bundle exec rake
|
|
16
16
|
|
17
17
|
env:
|
18
18
|
- ADAPTER=active_record
|
19
|
-
- ADAPTER=mongoid
|
19
|
+
- ADAPTER=mongoid MONGOID_VERSION=3
|
20
|
+
- ADAPTER=mongoid MONGOID_VERSION=4
|
21
|
+
- ADAPTER=mongoid MONGOID_VERSION=5
|
20
22
|
|
21
23
|
services: mongodb
|
22
24
|
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= 5.0.0 (Nov 17, 2015)
|
2
|
+
* Fix migration warning showing when it shouldn't
|
3
|
+
* Add role lazy-loading
|
4
|
+
* Add has_cached_role and has_cached_strict_role to project.
|
5
|
+
See: https://github.com/RolifyCommunity/rolify#cached-roles-to-avoid-n1-issue
|
6
|
+
* Update specs to pass with all Mongoid version.
|
7
|
+
|
1
8
|
= 4.1.1 (Aug 06, 2015)
|
2
9
|
* Fix a regression in the dynamic method loader.
|
3
10
|
|
data/Gemfile
CHANGED
@@ -7,7 +7,14 @@ group :test do
|
|
7
7
|
gem "sqlite3", :platform => "ruby"
|
8
8
|
gem "activerecord", ">= 3.2.0", :require => "active_record"
|
9
9
|
when "mongoid"
|
10
|
-
|
10
|
+
case ENV["MONGOID_VERSION"]
|
11
|
+
when nil, '5'
|
12
|
+
gem "mongoid", "~> 5"
|
13
|
+
when '4'
|
14
|
+
gem "mongoid", "~> 4"
|
15
|
+
when '3'
|
16
|
+
gem "mongoid", "~> 3"
|
17
|
+
end
|
11
18
|
gem "bson_ext", :platform => "ruby"
|
12
19
|
else
|
13
20
|
raise "Unknown model adapter: #{ENV["ADAPTER"]}"
|
@@ -17,6 +24,8 @@ group :test do
|
|
17
24
|
gem 'its'
|
18
25
|
gem 'byebug'
|
19
26
|
gem 'pry-byebug'
|
27
|
+
gem 'test-unit' # Implicitly loaded by ammeter
|
28
|
+
gem 'database_cleaner'
|
20
29
|
gem 'codeclimate-test-reporter', :require => nil
|
21
30
|
end
|
22
31
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rolify [![Gem Version](https://badge.fury.io/rb/rolify.svg)](http://badge.fury.io/rb/rolify) [![build status](https://secure.travis-ci.org/RolifyCommunity/rolify.png)](http://travis-ci.org/RolifyCommunity/rolify) [![Dependency Status](https://gemnasium.com/RolifyCommunity/rolify.svg)](https://gemnasium.com/RolifyCommunity/rolify) [![Code Climate](https://codeclimate.com/github/RolifyCommunity/rolify.png)](https://codeclimate.com/github/RolifyCommunity/rolify) [![Coverage Status](https://
|
1
|
+
# rolify [![Gem Version](https://badge.fury.io/rb/rolify.svg)](http://badge.fury.io/rb/rolify) [![build status](https://secure.travis-ci.org/RolifyCommunity/rolify.png)](http://travis-ci.org/RolifyCommunity/rolify) [![Dependency Status](https://gemnasium.com/RolifyCommunity/rolify.svg)](https://gemnasium.com/RolifyCommunity/rolify) [![Code Climate](https://codeclimate.com/github/RolifyCommunity/rolify.png)](https://codeclimate.com/github/RolifyCommunity/rolify) [![Coverage Status](https://coveralls.io/repos/RolifyCommunity/rolify/badge.svg?branch=master&service=github)](https://coveralls.io/github/RolifyCommunity/rolify?branch=master)
|
2
2
|
|
3
3
|
Very simple Roles library without any authorization enforcement supporting scope on resource object.
|
4
4
|
|
@@ -221,6 +221,20 @@ end
|
|
221
221
|
```
|
222
222
|
I.e. you get true only on a role that you manually add.
|
223
223
|
|
224
|
+
### Cached Roles (to avoid N+1 issue)
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
@user.add_role :admin, Forum
|
228
|
+
@user.add_role :member, Forum
|
229
|
+
|
230
|
+
users = User.with_role(:admin, Forum).preload(:roles)
|
231
|
+
users.each do |user|
|
232
|
+
user.has_cached_role?(:member, Forum) # no extra queries
|
233
|
+
end
|
234
|
+
```
|
235
|
+
|
236
|
+
This method should be used with caution. If you don't preload the roles, the `has_cached_role?` might return `false`. In the above example, it would return `false` for `@user.has_cached_role?(:member, Forum)`, because `User.with_role(:admin, Forum)` will load only the `:admin` roles.
|
237
|
+
|
224
238
|
## Resources
|
225
239
|
|
226
240
|
* [Wiki](https://github.com/RolifyCommunity/rolify/wiki)
|
@@ -18,6 +18,28 @@ module Rolify
|
|
18
18
|
relation.where(:name => args[:name], :resource_type => resource[:class], :resource_id => resource[:id])
|
19
19
|
end
|
20
20
|
|
21
|
+
def find_cached(relation, args)
|
22
|
+
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class) || args[:resource] == :any) ? nil : args[:resource].id
|
23
|
+
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
|
24
|
+
|
25
|
+
return relation.find_all { |role| role.name == args[:name].to_s } if args[:resource] == :any
|
26
|
+
|
27
|
+
relation.find_all do |role|
|
28
|
+
(role.name == args[:name].to_s && role.resource_type == nil && role.resource_id == nil) ||
|
29
|
+
(role.name == args[:name].to_s && role.resource_type == resource_type && role.resource_id == nil) ||
|
30
|
+
(role.name == args[:name].to_s && role.resource_type == resource_type && role.resource_id == resource_id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_cached_strict(relation, args)
|
35
|
+
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class)) ? nil : args[:resource].id
|
36
|
+
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
|
37
|
+
|
38
|
+
relation.find_all do |role|
|
39
|
+
role.resource_id == resource_id && role.resource_type == resource_type && role.name == args[:name].to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
21
43
|
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
|
22
44
|
role_class.where(:name => role_name, :resource_type => resource_type, :resource_id => resource_id).first_or_create
|
23
45
|
end
|
@@ -18,6 +18,28 @@ module Rolify
|
|
18
18
|
relation.where(:name => args[:name], :resource_type => resource[:class], :resource_id => resource[:id])
|
19
19
|
end
|
20
20
|
|
21
|
+
def find_cached(relation, args)
|
22
|
+
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class) || args[:resource] == :any) ? nil : args[:resource].id
|
23
|
+
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
|
24
|
+
|
25
|
+
return relation.find_all { |role| role.name == args[:name].to_s } if args[:resource] == :any
|
26
|
+
|
27
|
+
relation.find_all do |role|
|
28
|
+
(role.name == args[:name].to_s && role.resource_type == nil && role.resource_id == nil) ||
|
29
|
+
(role.name == args[:name].to_s && role.resource_type == resource_type && role.resource_id == nil) ||
|
30
|
+
(role.name == args[:name].to_s && role.resource_type == resource_type && role.resource_id == resource_id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_cached_strict(relation, args)
|
35
|
+
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class)) ? nil : args[:resource].id
|
36
|
+
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
|
37
|
+
|
38
|
+
relation.find_all do |role|
|
39
|
+
role.resource_id == resource_id && role.resource_type == resource_type && role.name == args[:name].to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
21
43
|
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
|
22
44
|
self.role_class.find_or_create_by(:name => role_name,
|
23
45
|
:resource_type => resource_type,
|
data/lib/rolify/configure.rb
CHANGED
@@ -52,9 +52,8 @@ module Rolify
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def sanity_check(role_cnames)
|
55
|
-
return true if (
|
55
|
+
return true if ARGV.reduce(nil) { |acc,arg| arg =~ /assets:/ if acc.nil? } == 0
|
56
56
|
|
57
|
-
role_cnames = [ "Role" ] if role_cnames.empty?
|
58
57
|
role_cnames.each do |role_cname|
|
59
58
|
role_class = role_cname.constantize
|
60
59
|
if role_class.superclass.to_s == "ActiveRecord::Base" && role_table_missing?(role_class)
|
@@ -67,6 +66,9 @@ module Rolify
|
|
67
66
|
|
68
67
|
def role_table_missing?(role_class)
|
69
68
|
!role_class.table_exists?
|
69
|
+
rescue ActiveRecord::NoDatabaseError
|
70
|
+
true
|
70
71
|
end
|
72
|
+
|
71
73
|
end
|
72
74
|
end
|
data/lib/rolify/dynamic.rb
CHANGED
@@ -5,7 +5,7 @@ module Rolify
|
|
5
5
|
def load_dynamic_methods
|
6
6
|
if ENV['ADAPTER'] == 'active_record'
|
7
7
|
# supported Rails version >= 3.2 with AR should use find_each, since use of .all.each is deprecated
|
8
|
-
self.role_class.includes(:resource).find_each do |r|
|
8
|
+
self.role_class.group("name, resource_type").includes(:resource).find_each do |r|
|
9
9
|
define_dynamic_method(r.name, r.resource)
|
10
10
|
end
|
11
11
|
else
|
data/lib/rolify/matchers.rb
CHANGED
@@ -5,11 +5,11 @@ RSpec::Matchers.define :have_role do |*args|
|
|
5
5
|
resource.has_role?(*args)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
failure_message do |resource|
|
9
9
|
"expected to have role #{args.map(&:inspect).join(" ")}"
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
failure_message_when_negated do |resource|
|
13
13
|
"expected not to have role #{args.map(&:inspect).join(" ")}"
|
14
14
|
end
|
15
15
|
end
|
data/lib/rolify/role.rb
CHANGED
@@ -44,6 +44,15 @@ module Rolify
|
|
44
44
|
self.class.adapter.where_strict(self.roles, name: role_name, resource: resource).any?
|
45
45
|
end
|
46
46
|
|
47
|
+
def has_cached_role?(role_name, resource = nil)
|
48
|
+
return has_strict_cached_role?(role_name, resource) if self.class.strict_rolify and resource and resource != :any
|
49
|
+
self.class.adapter.find_cached(self.roles, name: role_name, resource: resource).any?
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_strict_cached_role?(role_name, resource = nil)
|
53
|
+
self.class.adapter.find_cached_strict(self.roles, name: role_name, resource: resource).any?
|
54
|
+
end
|
55
|
+
|
47
56
|
def has_all_roles?(*args)
|
48
57
|
args.each do |arg|
|
49
58
|
if arg.is_a? Hash
|
data/lib/rolify/version.rb
CHANGED
data/rolify.gemspec
CHANGED
@@ -13,16 +13,22 @@ Gem::Specification.new do |s|
|
|
13
13
|
|
14
14
|
s.license = 'MIT'
|
15
15
|
|
16
|
-
s.authors = [
|
17
|
-
|
16
|
+
s.authors = [
|
17
|
+
'Florent Monbillard',
|
18
|
+
'Wellington Cordeiro'
|
19
|
+
]
|
20
|
+
s.email = [
|
21
|
+
'f.monbillard@gmail.com',
|
22
|
+
'wellington@wellingtoncordeiro.com'
|
23
|
+
]
|
18
24
|
|
19
25
|
s.files = `git ls-files`.split("\n")
|
20
26
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
21
27
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
28
|
s.require_paths = ['lib']
|
23
29
|
|
24
|
-
s.add_development_dependency 'ammeter', '~> 1.1
|
25
|
-
s.add_development_dependency 'bundler', '
|
26
|
-
s.add_development_dependency 'rake', '~> 10.4
|
27
|
-
s.add_development_dependency 'rspec-rails', '
|
30
|
+
s.add_development_dependency 'ammeter', '~> 1.1' # Spec generator
|
31
|
+
s.add_development_dependency 'bundler', '~> 1.10' # packaging feature
|
32
|
+
s.add_development_dependency 'rake', '~> 10.4' # Tasks manager
|
33
|
+
s.add_development_dependency 'rspec-rails', '~> 3.4'
|
28
34
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test-unit'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'pry'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
# `Test::Unit::AutoRunner.need_auto_run=` was introduced to the test-unit
|
9
|
+
# gem in version 2.4.9. Previous to this version `Test::Unit.run=` was
|
10
|
+
# used. The implementation of test-unit included with Ruby has neither
|
11
|
+
# method.
|
12
|
+
if defined? Test::Unit::AutoRunner
|
13
|
+
Test::Unit::AutoRunner.need_auto_run = false
|
14
|
+
elsif defined?(Test::Unit)
|
15
|
+
Test::Unit.run = false
|
16
|
+
end
|
data/spec/generators_helper.rb
CHANGED
@@ -1,21 +1,28 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require "bundler/setup"
|
3
3
|
|
4
|
+
require 'pry'
|
5
|
+
|
4
6
|
require 'rolify'
|
5
7
|
require 'rolify/matchers'
|
6
|
-
require 'rails'
|
8
|
+
require 'rails/all'
|
7
9
|
require_relative 'support/stream_helpers'
|
8
10
|
include StreamHelpers
|
9
11
|
|
10
12
|
require 'coveralls'
|
11
13
|
Coveralls.wear_merged!
|
12
14
|
|
15
|
+
require 'common_helper'
|
16
|
+
|
13
17
|
ENV['ADAPTER'] ||= 'active_record'
|
14
18
|
|
15
19
|
if ENV['ADAPTER'] == 'active_record'
|
20
|
+
load File.dirname(__FILE__) + '/support/adapters/utils/active_record.rb'
|
16
21
|
require 'active_record/railtie'
|
22
|
+
establish_connection
|
17
23
|
else
|
18
|
-
|
24
|
+
load File.dirname(__FILE__) + '/support/adapters/utils/mongoid.rb'
|
25
|
+
load_mongoid_config
|
19
26
|
end
|
20
27
|
|
21
28
|
module TestApp
|
data/spec/rolify/config_spec.rb
CHANGED
data/spec/rolify/custom_spec.rb
CHANGED
@@ -542,29 +542,35 @@ describe Rolify::Resource do
|
|
542
542
|
context "strict user" do
|
543
543
|
before(:all) do
|
544
544
|
@strict_user = StrictUser.first
|
545
|
+
@strict_user.role_ids
|
545
546
|
@strict_user.add_role(:forum, Forum.first)
|
546
547
|
@strict_user.add_role(:forum, Forum)
|
547
548
|
end
|
548
549
|
|
549
550
|
it "should return only strict forum" do
|
550
551
|
@strict_user.has_role?(:forum, Forum.first).should be true
|
552
|
+
@strict_user.has_cached_role?(:forum, Forum.first).should be true
|
551
553
|
end
|
552
554
|
|
553
555
|
it "should return false on strict another forum" do
|
554
556
|
@strict_user.has_role?(:forum, Forum.last).should be false
|
557
|
+
@strict_user.has_cached_role?(:forum, Forum.last).should be false
|
555
558
|
end
|
556
559
|
|
557
560
|
it "should return true if user has role on Forum model" do
|
558
561
|
@strict_user.has_role?(:forum, Forum).should be true
|
562
|
+
@strict_user.has_cached_role?(:forum, Forum).should be true
|
559
563
|
end
|
560
564
|
|
561
565
|
it "should return true if user has role any forum name" do
|
562
566
|
@strict_user.has_role?(:forum, :any).should be true
|
567
|
+
@strict_user.has_cached_role?(:forum, :any).should be true
|
563
568
|
end
|
564
569
|
|
565
570
|
it "should return false when deleted role on Forum model" do
|
566
571
|
@strict_user.remove_role(:forum, Forum)
|
567
572
|
@strict_user.has_role?(:forum, Forum).should be false
|
573
|
+
@strict_user.has_cached_role?(:forum, Forum).should be false
|
568
574
|
end
|
569
575
|
end
|
570
576
|
end
|
@@ -3,10 +3,16 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
3
3
|
context "with a global role", :scope => :global do
|
4
4
|
it { subject.has_role?("admin".send(param_method)).should be_truthy }
|
5
5
|
|
6
|
+
it { subject.has_cached_role?("admin".send(param_method)).should be_truthy }
|
7
|
+
|
6
8
|
context "on resource request" do
|
7
9
|
it { subject.has_role?("admin".send(param_method), Forum.first).should be_truthy }
|
8
10
|
it { subject.has_role?("admin".send(param_method), Forum).should be_truthy }
|
9
11
|
it { subject.has_role?("admin".send(param_method), :any).should be_truthy }
|
12
|
+
|
13
|
+
it { subject.has_cached_role?("admin".send(param_method), Forum.first).should be_truthy }
|
14
|
+
it { subject.has_cached_role?("admin".send(param_method), Forum).should be_truthy }
|
15
|
+
it { subject.has_cached_role?("admin".send(param_method), :any).should be_truthy }
|
10
16
|
end
|
11
17
|
|
12
18
|
context "with another global role" do
|
@@ -14,19 +20,29 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
14
20
|
|
15
21
|
it { subject.has_role?("global".send(param_method)).should be_falsey }
|
16
22
|
it { subject.has_role?("global".send(param_method), :any).should be_falsey }
|
23
|
+
|
24
|
+
it { subject.has_cached_role?("global".send(param_method)).should be_falsey }
|
25
|
+
it { subject.has_cached_role?("global".send(param_method), :any).should be_falsey }
|
17
26
|
end
|
18
27
|
|
19
28
|
it "should not get an instance scoped role" do
|
20
29
|
subject.has_role?("moderator".send(param_method), Group.first).should be_falsey
|
30
|
+
|
31
|
+
subject.has_cached_role?("moderator".send(param_method), Group.first).should be_falsey
|
21
32
|
end
|
22
33
|
|
23
34
|
it "should not get a class scoped role" do
|
24
35
|
subject.has_role?("manager".send(param_method), Forum).should be_falsey
|
36
|
+
|
37
|
+
subject.has_cached_role?("manager".send(param_method), Forum).should be_falsey
|
25
38
|
end
|
26
39
|
|
27
40
|
context "using inexisting role" do
|
28
41
|
it { subject.has_role?("dummy".send(param_method)).should be_falsey }
|
29
42
|
it { subject.has_role?("dumber".send(param_method), Forum.first).should be_falsey }
|
43
|
+
|
44
|
+
it { subject.has_cached_role?("dummy".send(param_method)).should be_falsey }
|
45
|
+
it { subject.has_cached_role?("dumber".send(param_method), Forum.first).should be_falsey }
|
30
46
|
end
|
31
47
|
end
|
32
48
|
|
@@ -35,15 +51,23 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
35
51
|
it { subject.has_role?("manager".send(param_method), Forum).should be_truthy }
|
36
52
|
it { subject.has_role?("manager".send(param_method), Forum.first).should be_truthy }
|
37
53
|
it { subject.has_role?("manager".send(param_method), :any).should be_truthy }
|
54
|
+
|
55
|
+
it { subject.has_cached_role?("manager".send(param_method), Forum).should be_truthy }
|
56
|
+
it { subject.has_cached_role?("manager".send(param_method), Forum.first).should be_truthy }
|
57
|
+
it { subject.has_cached_role?("manager".send(param_method), :any).should be_truthy }
|
38
58
|
end
|
39
59
|
|
40
60
|
it "should not get a scoped role when asking for a global" do
|
41
61
|
subject.has_role?("manager".send(param_method)).should be_falsey
|
62
|
+
|
63
|
+
subject.has_cached_role?("manager".send(param_method)).should be_falsey
|
42
64
|
end
|
43
65
|
|
44
66
|
it "should not get a global role" do
|
45
67
|
role_class.create(:name => "admin")
|
46
68
|
subject.has_role?("admin".send(param_method)).should be_falsey
|
69
|
+
|
70
|
+
subject.has_cached_role?("admin".send(param_method)).should be_falsey
|
47
71
|
end
|
48
72
|
|
49
73
|
context "with another class scoped role" do
|
@@ -52,6 +76,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
52
76
|
|
53
77
|
it { subject.has_role?("member".send(param_method), Forum).should be_falsey }
|
54
78
|
it { subject.has_role?("member".send(param_method), :any).should be_falsey }
|
79
|
+
|
80
|
+
it { subject.has_cached_role?("member".send(param_method), Forum).should be_falsey }
|
81
|
+
it { subject.has_cached_role?("member".send(param_method), :any).should be_falsey }
|
55
82
|
end
|
56
83
|
|
57
84
|
context "on another resource with the same name" do
|
@@ -59,6 +86,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
59
86
|
|
60
87
|
it { subject.has_role?("manager".send(param_method), Group).should be_falsey }
|
61
88
|
it { subject.has_role?("manager".send(param_method), :any).should be_truthy }
|
89
|
+
|
90
|
+
it { subject.has_cached_role?("manager".send(param_method), Group).should be_falsey }
|
91
|
+
it { subject.has_cached_role?("manager".send(param_method), :any).should be_truthy }
|
62
92
|
end
|
63
93
|
|
64
94
|
context "on another resource with another name" do
|
@@ -66,12 +96,18 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
66
96
|
|
67
97
|
it { subject.has_role?("defenders".send(param_method), Group).should be_falsey }
|
68
98
|
it { subject.has_role?("defenders".send(param_method), :any).should be_falsey }
|
99
|
+
|
100
|
+
it { subject.has_cached_role?("defenders".send(param_method), Group).should be_falsey }
|
101
|
+
it { subject.has_cached_role?("defenders".send(param_method), :any).should be_falsey }
|
69
102
|
end
|
70
103
|
end
|
71
104
|
|
72
105
|
context "using inexisting role" do
|
73
106
|
it { subject.has_role?("dummy".send(param_method), Forum).should be_falsey }
|
74
107
|
it { subject.has_role?("dumber".send(param_method)).should be_falsey }
|
108
|
+
|
109
|
+
it { subject.has_cached_role?("dummy".send(param_method), Forum).should be_falsey }
|
110
|
+
it { subject.has_cached_role?("dumber".send(param_method)).should be_falsey }
|
75
111
|
end
|
76
112
|
end
|
77
113
|
|
@@ -84,19 +120,33 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
84
120
|
m.add_role("moderator", Forum.first)
|
85
121
|
m.has_role?("moderator".send(param_method), :any).should be_truthy
|
86
122
|
}
|
123
|
+
|
124
|
+
it { subject.has_cached_role?("moderator".send(param_method), Forum.first).should be_truthy }
|
125
|
+
it { subject.has_cached_role?("moderator".send(param_method), :any).should be_truthy }
|
126
|
+
it {
|
127
|
+
m = subject.class.new
|
128
|
+
m.add_role("moderator", Forum.first)
|
129
|
+
m.has_cached_role?("moderator".send(param_method), :any).should be_truthy
|
130
|
+
}
|
87
131
|
end
|
88
132
|
|
89
133
|
it "should not get an instance scoped role when asking for a global" do
|
90
134
|
subject.has_role?("moderator".send(param_method)).should be_falsey
|
135
|
+
|
136
|
+
subject.has_cached_role?("moderator".send(param_method)).should be_falsey
|
91
137
|
end
|
92
138
|
|
93
139
|
it "should not get an instance scoped role when asking for a class scoped" do
|
94
140
|
subject.has_role?("moderator".send(param_method), Forum).should be_falsey
|
141
|
+
|
142
|
+
subject.has_cached_role?("moderator".send(param_method), Forum).should be_falsey
|
95
143
|
end
|
96
144
|
|
97
145
|
it "should not get a global role" do
|
98
146
|
role_class.create(:name => "admin")
|
99
147
|
subject.has_role?("admin".send(param_method)).should be_falsey
|
148
|
+
|
149
|
+
subject.has_cached_role?("admin".send(param_method)).should be_falsey
|
100
150
|
end
|
101
151
|
|
102
152
|
context "with another instance scoped role" do
|
@@ -105,6 +155,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
105
155
|
|
106
156
|
it { subject.has_role?("member".send(param_method), Forum.first).should be_falsey }
|
107
157
|
it { subject.has_role?("member".send(param_method), :any).should be_falsey }
|
158
|
+
|
159
|
+
it { subject.has_cached_role?("member".send(param_method), Forum.first).should be_falsey }
|
160
|
+
it { subject.has_cached_role?("member".send(param_method), :any).should be_falsey }
|
108
161
|
end
|
109
162
|
|
110
163
|
context "on another resource of the same type but with the same role name" do
|
@@ -112,6 +165,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
112
165
|
|
113
166
|
it { subject.has_role?("moderator".send(param_method), Forum.last).should be_falsey }
|
114
167
|
it { subject.has_role?("moderator".send(param_method), :any).should be_truthy }
|
168
|
+
|
169
|
+
it { subject.has_cached_role?("moderator".send(param_method), Forum.last).should be_falsey }
|
170
|
+
it { subject.has_cached_role?("moderator".send(param_method), :any).should be_truthy }
|
115
171
|
end
|
116
172
|
|
117
173
|
context "on another resource of different type but with the same role name" do
|
@@ -119,6 +175,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
119
175
|
|
120
176
|
it { subject.has_role?("moderator".send(param_method), Group.last).should be_falsey }
|
121
177
|
it { subject.has_role?("moderator".send(param_method), :any).should be_truthy }
|
178
|
+
|
179
|
+
it { subject.has_cached_role?("moderator".send(param_method), Group.last).should be_falsey }
|
180
|
+
it { subject.has_cached_role?("moderator".send(param_method), :any).should be_truthy }
|
122
181
|
end
|
123
182
|
|
124
183
|
context "on another resource of the same type and with another role name" do
|
@@ -126,6 +185,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
126
185
|
|
127
186
|
it { subject.has_role?("member".send(param_method), Forum.last).should be_falsey }
|
128
187
|
it { subject.has_role?("member".send(param_method), :any).should be_falsey }
|
188
|
+
|
189
|
+
it { subject.has_cached_role?("member".send(param_method), Forum.last).should be_falsey }
|
190
|
+
it { subject.has_cached_role?("member".send(param_method), :any).should be_falsey }
|
129
191
|
end
|
130
192
|
|
131
193
|
context "on another resource of different type and with another role name" do
|
@@ -133,6 +195,9 @@ shared_examples_for "#has_role?_examples" do |param_name, param_method|
|
|
133
195
|
|
134
196
|
it { subject.has_role?("member".send(param_method), Group.first).should be_falsey }
|
135
197
|
it { subject.has_role?("member".send(param_method), :any).should be_falsey }
|
198
|
+
|
199
|
+
it { subject.has_cached_role?("member".send(param_method), Group.first).should be_falsey }
|
200
|
+
it { subject.has_cached_role?("member".send(param_method), :any).should be_falsey }
|
136
201
|
end
|
137
202
|
end
|
138
203
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "codeclimate-test-reporter"
|
2
|
+
|
2
3
|
CodeClimate::TestReporter.start
|
3
4
|
|
4
5
|
require 'rubygems'
|
@@ -11,6 +12,8 @@ begin
|
|
11
12
|
require 'its'
|
12
13
|
rescue LoadError
|
13
14
|
end
|
15
|
+
require 'database_cleaner'
|
16
|
+
|
14
17
|
require 'coveralls'
|
15
18
|
Coveralls.wear_merged!
|
16
19
|
|
@@ -19,10 +22,7 @@ ENV['ADAPTER'] ||= 'active_record'
|
|
19
22
|
load File.dirname(__FILE__) + "/support/adapters/#{ENV['ADAPTER']}.rb"
|
20
23
|
load File.dirname(__FILE__) + '/support/data.rb'
|
21
24
|
|
22
|
-
|
23
|
-
require 'pry'
|
24
|
-
rescue LoadError
|
25
|
-
end
|
25
|
+
|
26
26
|
|
27
27
|
def reset_defaults
|
28
28
|
Rolify.use_defaults
|
@@ -47,3 +47,17 @@ def silence_warnings(&block)
|
|
47
47
|
$VERBOSE = warn_level
|
48
48
|
result
|
49
49
|
end
|
50
|
+
|
51
|
+
RSpec.configure do |config|
|
52
|
+
config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
|
53
|
+
|
54
|
+
config.before(:suite) do
|
55
|
+
DatabaseCleaner.strategy = :truncation
|
56
|
+
DatabaseCleaner.start
|
57
|
+
end
|
58
|
+
|
59
|
+
config.after(:suite) do |example|
|
60
|
+
DatabaseCleaner.clean
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
load File.dirname(__FILE__) + '/utils/active_record.rb'
|
2
|
+
|
3
|
+
extend_rspec_with_activerecord_specific_matchers
|
4
|
+
establish_connection
|
2
5
|
|
3
|
-
RSpec::Matchers::BuiltIn::OperatorMatcher.register(ActiveRecord::Relation, '=~', RSpec::Matchers::BuiltIn::MatchArray)
|
4
|
-
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
5
6
|
ActiveRecord::Base.extend Rolify
|
6
7
|
|
7
8
|
load File.dirname(__FILE__) + '/../schema.rb'
|
@@ -1,6 +1,11 @@
|
|
1
|
-
|
1
|
+
load File.dirname(__FILE__) + '/utils/mongoid.rb'
|
2
2
|
|
3
|
-
|
3
|
+
load_mongoid_config
|
4
|
+
|
5
|
+
begin
|
6
|
+
Mongo::Logger.logger.level = ::Logger::FATAL
|
7
|
+
rescue NameError
|
8
|
+
end
|
4
9
|
|
5
10
|
::Mongoid::Document.module_eval do
|
6
11
|
def self.included(base)
|
@@ -13,6 +18,8 @@ Rolify.use_mongoid
|
|
13
18
|
# Standard user and role classes
|
14
19
|
class User
|
15
20
|
include Mongoid::Document
|
21
|
+
default_scope -> { order_by id: 'asc' }
|
22
|
+
|
16
23
|
rolify
|
17
24
|
|
18
25
|
field :login, :type => String
|
@@ -21,6 +28,7 @@ end
|
|
21
28
|
# Standard user and role classes
|
22
29
|
class StrictUser
|
23
30
|
include Mongoid::Document
|
31
|
+
default_scope -> { order_by id: 'asc' }
|
24
32
|
rolify strict: true
|
25
33
|
|
26
34
|
field :login, :type => String
|
@@ -48,6 +56,7 @@ end
|
|
48
56
|
# Resourcifed and rolifed at the same time
|
49
57
|
class HumanResource
|
50
58
|
include Mongoid::Document
|
59
|
+
default_scope -> { order_by id: 'asc' }
|
51
60
|
resourcify :resources
|
52
61
|
rolify
|
53
62
|
|
@@ -74,6 +83,7 @@ end
|
|
74
83
|
# Custom role and class names
|
75
84
|
class Customer
|
76
85
|
include Mongoid::Document
|
86
|
+
default_scope -> { order_by id: 'asc' }
|
77
87
|
rolify :role_cname => "Privilege"
|
78
88
|
|
79
89
|
field :login, :type => String
|
@@ -81,6 +91,7 @@ end
|
|
81
91
|
|
82
92
|
class Privilege
|
83
93
|
include Mongoid::Document
|
94
|
+
default_scope -> { order_by id: 'asc' }
|
84
95
|
has_and_belongs_to_many :customers
|
85
96
|
belongs_to :resource, :polymorphic => true
|
86
97
|
scopify
|
@@ -100,6 +111,7 @@ end
|
|
100
111
|
module Admin
|
101
112
|
class Moderator
|
102
113
|
include Mongoid::Document
|
114
|
+
default_scope -> { order_by id: 'asc' }
|
103
115
|
rolify :role_cname => "Admin::Right"
|
104
116
|
|
105
117
|
field :login, :type => String
|
@@ -107,6 +119,7 @@ module Admin
|
|
107
119
|
|
108
120
|
class Right
|
109
121
|
include Mongoid::Document
|
122
|
+
default_scope -> { order_by id: 'asc' }
|
110
123
|
has_and_belongs_to_many :moderators, :class_name => 'Admin::Moderator'
|
111
124
|
belongs_to :resource, :polymorphic => true
|
112
125
|
scopify
|
@@ -126,6 +139,7 @@ end
|
|
126
139
|
# Resources classes
|
127
140
|
class Forum
|
128
141
|
include Mongoid::Document
|
142
|
+
default_scope -> { order_by id: 'asc' }
|
129
143
|
#resourcify done during specs setup to be able to use custom user classes
|
130
144
|
|
131
145
|
field :name, :type => String
|
@@ -133,6 +147,7 @@ end
|
|
133
147
|
|
134
148
|
class Group
|
135
149
|
include Mongoid::Document
|
150
|
+
default_scope -> { order_by id: 'asc' }
|
136
151
|
#resourcify done during specs setup to be able to use custom user classes
|
137
152
|
|
138
153
|
field :name, :type => String
|
@@ -145,6 +160,7 @@ end
|
|
145
160
|
|
146
161
|
class Team
|
147
162
|
include Mongoid::Document
|
163
|
+
default_scope -> { order_by id: 'asc' }
|
148
164
|
#resourcify done during specs setup to be able to use custom user classes
|
149
165
|
|
150
166
|
field :team_code, :type => Integer
|
@@ -153,6 +169,7 @@ end
|
|
153
169
|
|
154
170
|
class Organization
|
155
171
|
include Mongoid::Document
|
172
|
+
default_scope -> { order_by id: 'asc' }
|
156
173
|
end
|
157
174
|
|
158
175
|
class Company < Organization
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
def establish_connection
|
4
|
+
ActiveRecord::Base.establish_connection(
|
5
|
+
:adapter => "sqlite3",
|
6
|
+
:database => ":memory:"
|
7
|
+
)
|
8
|
+
end
|
9
|
+
|
10
|
+
def extend_rspec_with_activerecord_specific_matchers
|
11
|
+
RSpec::Matchers::BuiltIn::OperatorMatcher.register(ActiveRecord::Relation, '=~', RSpec::Matchers::BuiltIn::ContainExactly)
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'mongoid'
|
2
|
+
|
3
|
+
def mongoid_major_version
|
4
|
+
Mongoid::VERSION.split('.').first.to_i
|
5
|
+
end
|
6
|
+
|
7
|
+
def mongoid_config
|
8
|
+
"spec/support/adapters/mongoid_#{mongoid_major_version}.yml"
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_mongoid_config
|
12
|
+
Mongoid.load!(mongoid_config, :test)
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rolify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florent Monbillard
|
8
|
+
- Wellington Cordeiro
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-11-18 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: ammeter
|
@@ -16,61 +17,62 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.1
|
20
|
+
version: '1.1'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.1
|
27
|
+
version: '1.1'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: bundler
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- - "
|
32
|
+
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
34
|
+
version: '1.10'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- - "
|
39
|
+
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
41
|
+
version: '1.10'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: rake
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
46
|
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version: 10.4
|
48
|
+
version: '10.4'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version: 10.4
|
55
|
+
version: '10.4'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
57
|
name: rspec-rails
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
|
-
- -
|
60
|
+
- - "~>"
|
60
61
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
+
version: '3.4'
|
62
63
|
type: :development
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
|
-
- -
|
67
|
+
- - "~>"
|
67
68
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
+
version: '3.4'
|
69
70
|
description: Very simple Roles library without any authorization enforcement supporting
|
70
71
|
scope on resource objects (instance or class). Supports ActiveRecord and Mongoid
|
71
72
|
ORMs.
|
72
73
|
email:
|
73
74
|
- f.monbillard@gmail.com
|
75
|
+
- wellington@wellingtoncordeiro.com
|
74
76
|
executables: []
|
75
77
|
extensions: []
|
76
78
|
extra_rdoc_files: []
|
@@ -117,6 +119,7 @@ files:
|
|
117
119
|
- lib/rolify/version.rb
|
118
120
|
- rolify.gemspec
|
119
121
|
- spec/README.rdoc
|
122
|
+
- spec/common_helper.rb
|
120
123
|
- spec/generators/rolify/rolify_activerecord_generator_spec.rb
|
121
124
|
- spec/generators/rolify/rolify_mongoid_generator_spec.rb
|
122
125
|
- spec/generators_helper.rb
|
@@ -145,7 +148,11 @@ files:
|
|
145
148
|
- spec/spec_helper.rb
|
146
149
|
- spec/support/adapters/active_record.rb
|
147
150
|
- spec/support/adapters/mongoid.rb
|
148
|
-
- spec/support/adapters/
|
151
|
+
- spec/support/adapters/mongoid_3.yml
|
152
|
+
- spec/support/adapters/mongoid_4.yml
|
153
|
+
- spec/support/adapters/mongoid_5.yml
|
154
|
+
- spec/support/adapters/utils/active_record.rb
|
155
|
+
- spec/support/adapters/utils/mongoid.rb
|
149
156
|
- spec/support/data.rb
|
150
157
|
- spec/support/schema.rb
|
151
158
|
- spec/support/stream_helpers.rb
|
@@ -169,12 +176,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
176
|
version: '0'
|
170
177
|
requirements: []
|
171
178
|
rubyforge_project: rolify
|
172
|
-
rubygems_version: 2.4.5
|
179
|
+
rubygems_version: 2.4.5.1
|
173
180
|
signing_key:
|
174
181
|
specification_version: 4
|
175
182
|
summary: Roles library with resource scoping
|
176
183
|
test_files:
|
177
184
|
- spec/README.rdoc
|
185
|
+
- spec/common_helper.rb
|
178
186
|
- spec/generators/rolify/rolify_activerecord_generator_spec.rb
|
179
187
|
- spec/generators/rolify/rolify_mongoid_generator_spec.rb
|
180
188
|
- spec/generators_helper.rb
|
@@ -203,7 +211,11 @@ test_files:
|
|
203
211
|
- spec/spec_helper.rb
|
204
212
|
- spec/support/adapters/active_record.rb
|
205
213
|
- spec/support/adapters/mongoid.rb
|
206
|
-
- spec/support/adapters/
|
214
|
+
- spec/support/adapters/mongoid_3.yml
|
215
|
+
- spec/support/adapters/mongoid_4.yml
|
216
|
+
- spec/support/adapters/mongoid_5.yml
|
217
|
+
- spec/support/adapters/utils/active_record.rb
|
218
|
+
- spec/support/adapters/utils/mongoid.rb
|
207
219
|
- spec/support/data.rb
|
208
220
|
- spec/support/schema.rb
|
209
221
|
- spec/support/stream_helpers.rb
|