rolify 3.4.0 → 3.4.1
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/.travis.yml +32 -16
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile +4 -2
- data/README.md +1 -1
- data/Rakefile +6 -6
- data/gemfiles/Gemfile.rails-3.2 +14 -15
- data/gemfiles/Gemfile.rails-4.0 +21 -22
- data/gemfiles/Gemfile.rails-4.1 +37 -0
- data/lib/generators/active_record/rolify_generator.rb +2 -2
- data/lib/rolify.rb +6 -0
- data/lib/rolify/adapters/active_record/resource_adapter.rb +25 -4
- data/lib/rolify/adapters/base.rb +4 -0
- data/lib/rolify/adapters/mongoid/resource_adapter.rb +18 -1
- data/lib/rolify/configure.rb +6 -2
- data/lib/rolify/resource.rb +12 -9
- data/lib/rolify/role.rb +8 -2
- data/lib/rolify/version.rb +1 -1
- data/rolify.gemspec +15 -15
- data/spec/rolify/config_spec.rb +6 -7
- data/spec/rolify/resource_spec.rb +22 -6
- data/spec/rolify/shared_contexts.rb +1 -0
- data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +4 -4
- data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +27 -27
- data/spec/rolify/shared_examples/shared_examples_for_finders.rb +4 -0
- data/spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb +29 -29
- data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +32 -32
- data/spec/rolify/shared_examples/shared_examples_for_has_role.rb +38 -38
- data/spec/rolify/shared_examples/shared_examples_for_only_has_role.rb +44 -44
- data/spec/rolify/shared_examples/shared_examples_for_roles.rb +21 -15
- data/spec/spec_helper.rb +26 -3
- data/spec/support/adapters/active_record.rb +12 -4
- data/spec/support/adapters/mongoid.rb +8 -0
- data/spec/support/data.rb +4 -1
- data/spec/support/schema.rb +4 -0
- metadata +48 -33
- checksums.yaml +0 -7
data/.travis.yml
CHANGED
@@ -1,13 +1,9 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
1
3
|
rvm:
|
2
|
-
- 1.
|
3
|
-
- 2.0.0
|
4
|
-
- 2.1.0
|
5
|
-
- rbx
|
6
|
-
- jruby-19mode
|
4
|
+
- 2.1.2
|
7
5
|
|
8
|
-
|
9
|
-
- gemfiles/Gemfile.rails-3.2
|
10
|
-
- gemfiles/Gemfile.rails-4.0
|
6
|
+
script: bundle exec rake
|
11
7
|
|
12
8
|
env:
|
13
9
|
- ADAPTER=active_record
|
@@ -15,11 +11,31 @@ env:
|
|
15
11
|
|
16
12
|
services: mongodb
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
14
|
+
# language: ruby
|
15
|
+
#
|
16
|
+
# rvm:
|
17
|
+
# - 1.9.3
|
18
|
+
# - 2.0.0
|
19
|
+
# - 2.1.1
|
20
|
+
# - 2.1.2
|
21
|
+
# - rbx-2
|
22
|
+
# - jruby-19mode
|
23
|
+
#
|
24
|
+
# script: bundle exec rake
|
25
|
+
#
|
26
|
+
# gemfile:
|
27
|
+
# - gemfiles/Gemfile.rails-3.2
|
28
|
+
# - gemfiles/Gemfile.rails-4.0
|
29
|
+
# - gemfiles/Gemfile.rails-4.1
|
30
|
+
#
|
31
|
+
# env:
|
32
|
+
# - ADAPTER=active_record
|
33
|
+
# - ADAPTER=mongoid
|
34
|
+
#
|
35
|
+
# services: mongodb
|
36
|
+
#
|
37
|
+
# matrix:
|
38
|
+
# fast_finish: true
|
39
|
+
# exclude:
|
40
|
+
# - rvm: 1.9.3
|
41
|
+
# gemfile: gemfiles/Gemfile.rails-4.1
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
= 3.4.1 (Sep 07, 2014)
|
2
|
+
* Fixed issue with migrations being generated without a file extension.
|
3
|
+
* Updated spec tests to work with Travis CI on Ruby up to 2.1.2 and Rails 4.1.x
|
4
|
+
* Made it possible for inheritance of resources.
|
5
|
+
* Fixed small bugs throughout project.
|
6
|
+
|
1
7
|
= 3.4 (Jan 28, 2014)
|
2
8
|
* fixed an initializer bug preventing the rails app to boot
|
3
9
|
* enhanced documentation regarding <tt>with_role</tt> method (thanks to @vicomte)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rolify [](http://badge.fury.io/rb/rolify) [](http://badge.fury.io/rb/rolify) [](http://travis-ci.org/RolifyCommunity/rolify) [](https://gemnasium.com/EppO/rolify) [](https://codeclimate.com/github/EppO/rolify) [](https://coveralls.io/r/EppO/rolify)
|
2
2
|
|
3
3
|
|
4
4
|
Very simple Roles library without any authorization enforcement supporting scope on resource object.
|
data/Rakefile
CHANGED
@@ -7,17 +7,17 @@ Bundler::GemHelper.install_tasks
|
|
7
7
|
Coveralls::RakeTask.new
|
8
8
|
|
9
9
|
RSpec::Core::RakeTask.new(:generators) do |task|
|
10
|
-
task.pattern =
|
10
|
+
task.pattern = 'spec/generators/**/*_spec.rb'
|
11
11
|
end
|
12
12
|
|
13
13
|
RSpec::Core::RakeTask.new(:rolify) do |task|
|
14
|
-
task.pattern =
|
14
|
+
task.pattern = 'spec/rolify/**/*_spec.rb'
|
15
15
|
end
|
16
16
|
|
17
17
|
task :default => [ :spec, 'coveralls:push' ]
|
18
18
|
|
19
|
-
desc
|
20
|
-
task
|
19
|
+
desc 'Run all specs'
|
20
|
+
task 'spec' do
|
21
21
|
Rake::Task['generators'].invoke
|
22
22
|
return_code1 = $?.exitstatus
|
23
23
|
Rake::Task['rolify'].invoke
|
@@ -25,10 +25,10 @@ task "spec" do
|
|
25
25
|
fail if return_code1 != 0 || return_code2 != 0
|
26
26
|
end
|
27
27
|
|
28
|
-
desc
|
28
|
+
desc 'Run specs for all adapters'
|
29
29
|
task :spec_all do
|
30
30
|
%w[active_record mongoid].each do |model_adapter|
|
31
31
|
puts "ADAPTER = #{model_adapter}"
|
32
32
|
system "ADAPTER=#{model_adapter} rake"
|
33
33
|
end
|
34
|
-
end
|
34
|
+
end
|
data/gemfiles/Gemfile.rails-3.2
CHANGED
@@ -1,27 +1,26 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
platforms :rbx do
|
4
|
-
gem 'racc'
|
5
|
-
gem 'rubysl', '~> 2.0'
|
6
4
|
gem 'psych'
|
7
|
-
gem 'json'
|
8
5
|
gem 'rubinius-coverage', '~> 2.0'
|
9
|
-
gem 'rubysl-test-unit'
|
10
6
|
end
|
11
7
|
|
12
8
|
group :test do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
gem
|
17
|
-
|
18
|
-
|
19
|
-
gem
|
20
|
-
gem
|
9
|
+
gem 'railties', '~> 3.2', '< 4.0'
|
10
|
+
case ENV['ADAPTER']
|
11
|
+
when nil, 'active_record'
|
12
|
+
gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.rc', :platform => 'jruby'
|
13
|
+
#Fix sqlite3 version for rbx until rubinus is updated
|
14
|
+
#https://github.com/travis-ci/travis-ci/issues/2006
|
15
|
+
gem 'sqlite3', '1.3.8', :platform => 'ruby'
|
16
|
+
gem 'activerecord', '~> 3.2.0', :require => 'active_record'
|
17
|
+
when 'mongoid'
|
18
|
+
gem 'mongoid', '>= 3.1'
|
19
|
+
gem 'bson_ext', :platform => 'ruby'
|
21
20
|
else
|
22
|
-
raise "Unknown model adapter: #{ENV[
|
21
|
+
raise "Unknown model adapter: #{ENV['ADAPTER']}"
|
23
22
|
end
|
24
|
-
|
23
|
+
|
25
24
|
gem 'coveralls', :require => false
|
26
25
|
end
|
27
26
|
|
data/gemfiles/Gemfile.rails-4.0
CHANGED
@@ -1,34 +1,33 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
platforms :rbx do
|
4
|
-
gem 'racc'
|
5
|
-
gem 'rubysl', '~> 2.0'
|
6
4
|
gem 'psych'
|
7
|
-
gem 'json'
|
8
5
|
gem 'rubinius-coverage', '~> 2.0'
|
9
|
-
gem 'rubysl-test-unit'
|
10
6
|
end
|
11
7
|
|
12
8
|
group :test do
|
13
|
-
gem
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem
|
17
|
-
gem
|
18
|
-
gem
|
19
|
-
gem
|
9
|
+
gem 'railties', '~> 4.0.1', '< 4.1'
|
10
|
+
gem 'ammeter'
|
11
|
+
gem 'rake'
|
12
|
+
gem 'rspec'
|
13
|
+
gem 'its'
|
14
|
+
gem 'rspec-rails'
|
15
|
+
gem 'fuubar'
|
16
|
+
gem 'bundler'
|
20
17
|
|
21
18
|
gem 'coveralls', :require => false
|
22
|
-
|
23
|
-
case ENV[
|
24
|
-
when nil,
|
25
|
-
gem
|
26
|
-
gem
|
27
|
-
|
28
|
-
|
29
|
-
gem
|
30
|
-
|
19
|
+
|
20
|
+
case ENV['ADAPTER']
|
21
|
+
when nil, 'active_record'
|
22
|
+
gem 'activerecord', '~> 4.0.1', :require => 'active_record'
|
23
|
+
gem 'activerecord-jdbcsqlite3-adapter', '~> 1.3.5', :platform => 'jruby'
|
24
|
+
#Fix sqlite3 version for rbx until rubinus is updated
|
25
|
+
#https://github.com/travis-ci/travis-ci/issues/2006
|
26
|
+
gem 'sqlite3', '1.3.8', :platform => 'ruby'
|
27
|
+
when 'mongoid'
|
28
|
+
gem 'mongoid', github: 'mongoid/mongoid'
|
29
|
+
gem 'bson_ext', :platform => 'ruby'
|
31
30
|
else
|
32
|
-
raise "Unknown model adapter: #{ENV[
|
31
|
+
raise "Unknown model adapter: #{ENV['ADAPTER']}"
|
33
32
|
end
|
34
33
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
platforms :rbx do
|
4
|
+
gem 'psych'
|
5
|
+
gem 'rubinius-coverage', '~> 2.0'
|
6
|
+
end
|
7
|
+
|
8
|
+
group :test do
|
9
|
+
gem 'rails', github: 'rails/rails', branch: '4-1-stable'
|
10
|
+
# There is currently an active record bug in Rails 4.1.0, this is a workaround until 4.1.1 is released
|
11
|
+
# See https://github.com/rails/rails/issues/13648
|
12
|
+
# Without this patch, Resource.with_role(:role, User.first).count throws an SQL syntax exception
|
13
|
+
#gem 'railties', '~> 4.1.0'
|
14
|
+
gem 'ammeter'
|
15
|
+
gem 'rake'
|
16
|
+
gem 'rspec'
|
17
|
+
gem 'its'
|
18
|
+
gem 'rspec-rails'
|
19
|
+
gem 'fuubar'
|
20
|
+
gem 'bundler'
|
21
|
+
|
22
|
+
gem 'coveralls', :require => false
|
23
|
+
|
24
|
+
case ENV['ADAPTER']
|
25
|
+
when nil, 'active_record'
|
26
|
+
gem 'activerecord', '~> 4.1.0', :require => 'active_record'
|
27
|
+
gem 'activerecord-jdbcsqlite3-adapter', '~> 1.3.5', :platform => 'jruby'
|
28
|
+
#Fix sqlite3 version for rbx until rubinus is updated
|
29
|
+
#https://github.com/travis-ci/travis-ci/issues/2006
|
30
|
+
gem 'sqlite3', '1.3.8', :platform => 'ruby'
|
31
|
+
when 'mongoid'
|
32
|
+
gem 'mongoid', github: 'mongoid/mongoid'
|
33
|
+
gem 'bson_ext', :platform => 'ruby'
|
34
|
+
else
|
35
|
+
raise "Unknown model adapter: #{ENV['ADAPTER']}"
|
36
|
+
end
|
37
|
+
end
|
@@ -17,7 +17,7 @@ module ActiveRecord
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def copy_rolify_migration
|
20
|
-
migration_template "migration.rb", "db/migrate/rolify_create_#{table_name}"
|
20
|
+
migration_template "migration.rb", "db/migrate/rolify_create_#{table_name}.rb"
|
21
21
|
end
|
22
22
|
|
23
23
|
def join_table
|
@@ -47,4 +47,4 @@ RUBY
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
end
|
50
|
+
end
|
data/lib/rolify.rb
CHANGED
@@ -33,6 +33,11 @@ module Rolify
|
|
33
33
|
load_dynamic_methods if Rolify.dynamic_shortcuts
|
34
34
|
end
|
35
35
|
|
36
|
+
def adapter
|
37
|
+
return self.superclass.adapter unless self.instance_variable_defined? '@adapter'
|
38
|
+
@adapter
|
39
|
+
end
|
40
|
+
|
36
41
|
def resourcify(association_name = :roles, options = {})
|
37
42
|
include Resource
|
38
43
|
|
@@ -52,6 +57,7 @@ module Rolify
|
|
52
57
|
end
|
53
58
|
|
54
59
|
def role_class
|
60
|
+
return self.superclass.role_class unless self.instance_variable_defined? '@role_cname'
|
55
61
|
self.role_cname.constantize
|
56
62
|
end
|
57
63
|
end
|
@@ -3,23 +3,44 @@ require 'rolify/adapters/base'
|
|
3
3
|
module Rolify
|
4
4
|
module Adapter
|
5
5
|
class ResourceAdapter < ResourceAdapterBase
|
6
|
+
def find_roles(role_name, relation, user)
|
7
|
+
roles = user && (user != :any) ? user.roles : self.role_class
|
8
|
+
roles = roles.where('resource_type IN (?)', self.relation_types_for(relation))
|
9
|
+
roles = roles.where(:name => role_name.to_s) if role_name && (role_name != :any)
|
10
|
+
roles
|
11
|
+
end
|
12
|
+
|
6
13
|
def resources_find(roles_table, relation, role_name)
|
7
|
-
|
14
|
+
klasses = self.relation_types_for(relation)
|
15
|
+
relations = klasses.inject('') do |str, klass|
|
16
|
+
str = "#{str}'#{klass.to_s}'"
|
17
|
+
str << ', ' unless klass == klasses.last
|
18
|
+
str
|
19
|
+
end
|
20
|
+
resources = relation.joins("INNER JOIN #{quote(roles_table)} ON #{quote(roles_table)}.resource_type IN (#{relations}) AND
|
8
21
|
(#{quote(roles_table)}.resource_id IS NULL OR #{quote(roles_table)}.resource_id = #{quote(relation.table_name)}.#{relation.primary_key})")
|
9
|
-
resources = resources.where("#{quote(roles_table)}.name IN (?) AND #{quote(roles_table)}.resource_type
|
22
|
+
resources = resources.where("#{quote(roles_table)}.name IN (?) AND #{quote(roles_table)}.resource_type IN (?)", Array(role_name), klasses)
|
10
23
|
resources = resources.select("#{quote(relation.table_name)}.*")
|
11
24
|
resources
|
12
25
|
end
|
13
26
|
|
14
27
|
def in(relation, user, role_names)
|
15
|
-
roles = user.roles.where(:name => role_names).select(
|
28
|
+
roles = user.roles.where(:name => role_names).select("#{quote(role_class.table_name)}.#{role_class.primary_key}")
|
16
29
|
relation.where("#{quote(role_class.table_name)}.#{role_class.primary_key} IN (?) AND ((resource_id = #{quote(relation.table_name)}.#{relation.primary_key}) OR (resource_id IS NULL))", roles)
|
17
30
|
end
|
18
31
|
|
32
|
+
def applied_roles(relation, children)
|
33
|
+
if children
|
34
|
+
relation.role_class.where('resource_type IN (?) AND resource_id IS NULL', self.relation_types_for(relation))
|
35
|
+
else
|
36
|
+
relation.role_class.where('resource_type = ? AND resource_id IS NULL', relation.to_s)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
19
40
|
private
|
20
41
|
|
21
42
|
def quote(column)
|
22
|
-
|
43
|
+
ActiveRecord::Base.connection.quote_column_name column
|
23
44
|
end
|
24
45
|
end
|
25
46
|
end
|
data/lib/rolify/adapters/base.rb
CHANGED
@@ -23,6 +23,10 @@ module Rolify
|
|
23
23
|
load "rolify/adapters/#{Rolify.orm}/scopes.rb"
|
24
24
|
Rolify::Adapter.const_get(adapter.camelize.to_sym).new(role_cname, user_cname)
|
25
25
|
end
|
26
|
+
|
27
|
+
def relation_types_for(relation)
|
28
|
+
relation.descendants.map(&:to_s).push(relation.to_s)
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
class RoleAdapterBase < Adapter::Base
|
@@ -3,8 +3,16 @@ require 'rolify/adapters/base'
|
|
3
3
|
module Rolify
|
4
4
|
module Adapter
|
5
5
|
class ResourceAdapter < ResourceAdapterBase
|
6
|
+
|
7
|
+
def find_roles(role_name, relation, user)
|
8
|
+
roles = user && (user != :any) ? user.roles : self.role_class
|
9
|
+
roles = roles.where(:resource_type.in => self.relation_types_for(relation))
|
10
|
+
roles = roles.where(:name => role_name.to_s) if role_name && (role_name != :any)
|
11
|
+
roles
|
12
|
+
end
|
13
|
+
|
6
14
|
def resources_find(roles_table, relation, role_name)
|
7
|
-
roles = roles_table.classify.constantize.where(:name.in => Array(role_name), :resource_type => relation
|
15
|
+
roles = roles_table.classify.constantize.where(:name.in => Array(role_name), :resource_type.in => self.relation_types_for(relation))
|
8
16
|
resources = []
|
9
17
|
roles.each do |role|
|
10
18
|
if role.resource_id.nil?
|
@@ -22,6 +30,15 @@ module Rolify
|
|
22
30
|
resources.delete_if { |resource| (resource.applied_roles & roles).empty? }
|
23
31
|
resources
|
24
32
|
end
|
33
|
+
|
34
|
+
def applied_roles(relation, children)
|
35
|
+
if children
|
36
|
+
relation.role_class.where(:resource_type.in => self.relation_types_for(relation), :resource_id => nil)
|
37
|
+
else
|
38
|
+
relation.role_class.where(:resource_type => relation.to_s, :resource_id => nil)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
25
42
|
end
|
26
43
|
end
|
27
44
|
end
|
data/lib/rolify/configure.rb
CHANGED
@@ -45,12 +45,16 @@ module Rolify
|
|
45
45
|
role_cnames = [ "Role" ] if role_cnames.empty?
|
46
46
|
role_cnames.each do |role_cname|
|
47
47
|
role_class = role_cname.constantize
|
48
|
-
if role_class.superclass.to_s == "ActiveRecord::Base" &&
|
48
|
+
if role_class.superclass.to_s == "ActiveRecord::Base" && role_table_missing?(role_class)
|
49
49
|
warn "[WARN] table '#{role_cname}' doesn't exist. Did you run the migration ? Ignoring rolify config."
|
50
50
|
return false
|
51
51
|
end
|
52
52
|
end
|
53
53
|
true
|
54
54
|
end
|
55
|
+
|
56
|
+
def role_table_missing?(role_class)
|
57
|
+
role_class.connected? && !role_class.table_exists?
|
58
|
+
end
|
55
59
|
end
|
56
|
-
end
|
60
|
+
end
|
data/lib/rolify/resource.rb
CHANGED
@@ -4,12 +4,9 @@ module Rolify
|
|
4
4
|
base.extend ClassMethods
|
5
5
|
end
|
6
6
|
|
7
|
-
module ClassMethods
|
7
|
+
module ClassMethods
|
8
8
|
def find_roles(role_name = nil, user = nil)
|
9
|
-
|
10
|
-
roles = roles.where(:resource_type => self.to_s)
|
11
|
-
roles = roles.where(:name => role_name.to_s) if role_name && (role_name != :any)
|
12
|
-
roles
|
9
|
+
self.adapter.find_roles(role_name, self, user)
|
13
10
|
end
|
14
11
|
|
15
12
|
def with_role(role_name, user = nil)
|
@@ -18,14 +15,20 @@ module Rolify
|
|
18
15
|
else
|
19
16
|
role_name = role_name.to_s
|
20
17
|
end
|
21
|
-
|
18
|
+
|
19
|
+
resources = self.adapter.resources_find(self.role_table_name, self, role_name) #.map(&:id)
|
22
20
|
user ? self.adapter.in(resources, user, role_name) : resources
|
23
21
|
end
|
24
22
|
alias :with_roles :with_role
|
23
|
+
|
24
|
+
def applied_roles(children = true)
|
25
|
+
self.adapter.applied_roles(self, children)
|
26
|
+
end
|
25
27
|
end
|
26
|
-
|
28
|
+
|
27
29
|
def applied_roles
|
28
|
-
self.roles + self.class.role_class.where(:resource_type => self.class.to_s, :resource_id => nil)
|
30
|
+
#self.roles + self.class.role_class.where(:resource_type => self.class.to_s, :resource_id => nil)
|
31
|
+
self.roles + self.class.applied_roles(true)
|
29
32
|
end
|
30
33
|
end
|
31
|
-
end
|
34
|
+
end
|