rolify 4.1.1 → 5.0.0
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.
- 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 [](http://badge.fury.io/rb/rolify) [](http://travis-ci.org/RolifyCommunity/rolify) [](https://gemnasium.com/RolifyCommunity/rolify) [](https://codeclimate.com/github/RolifyCommunity/rolify) [](http://badge.fury.io/rb/rolify) [](http://travis-ci.org/RolifyCommunity/rolify) [](https://gemnasium.com/RolifyCommunity/rolify) [](https://codeclimate.com/github/RolifyCommunity/rolify) [](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
|