rolify 3.4.0 → 3.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/.travis.yml +32 -16
  2. data/CHANGELOG.rdoc +6 -0
  3. data/Gemfile +4 -2
  4. data/README.md +1 -1
  5. data/Rakefile +6 -6
  6. data/gemfiles/Gemfile.rails-3.2 +14 -15
  7. data/gemfiles/Gemfile.rails-4.0 +21 -22
  8. data/gemfiles/Gemfile.rails-4.1 +37 -0
  9. data/lib/generators/active_record/rolify_generator.rb +2 -2
  10. data/lib/rolify.rb +6 -0
  11. data/lib/rolify/adapters/active_record/resource_adapter.rb +25 -4
  12. data/lib/rolify/adapters/base.rb +4 -0
  13. data/lib/rolify/adapters/mongoid/resource_adapter.rb +18 -1
  14. data/lib/rolify/configure.rb +6 -2
  15. data/lib/rolify/resource.rb +12 -9
  16. data/lib/rolify/role.rb +8 -2
  17. data/lib/rolify/version.rb +1 -1
  18. data/rolify.gemspec +15 -15
  19. data/spec/rolify/config_spec.rb +6 -7
  20. data/spec/rolify/resource_spec.rb +22 -6
  21. data/spec/rolify/shared_contexts.rb +1 -0
  22. data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +4 -4
  23. data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +27 -27
  24. data/spec/rolify/shared_examples/shared_examples_for_finders.rb +4 -0
  25. data/spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb +29 -29
  26. data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +32 -32
  27. data/spec/rolify/shared_examples/shared_examples_for_has_role.rb +38 -38
  28. data/spec/rolify/shared_examples/shared_examples_for_only_has_role.rb +44 -44
  29. data/spec/rolify/shared_examples/shared_examples_for_roles.rb +21 -15
  30. data/spec/spec_helper.rb +26 -3
  31. data/spec/support/adapters/active_record.rb +12 -4
  32. data/spec/support/adapters/mongoid.rb +8 -0
  33. data/spec/support/data.rb +4 -1
  34. data/spec/support/schema.rb +4 -0
  35. metadata +48 -33
  36. checksums.yaml +0 -7
data/.travis.yml CHANGED
@@ -1,13 +1,9 @@
1
+ language: ruby
2
+
1
3
  rvm:
2
- - 1.9.3
3
- - 2.0.0
4
- - 2.1.0
5
- - rbx
6
- - jruby-19mode
4
+ - 2.1.2
7
5
 
8
- gemfile:
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
- matrix:
19
- exclude:
20
- - rvm: rbx
21
- gemfile: gemfiles/Gemfile.rails-3.2
22
- env: ADAPTER=mongoid
23
- - rvm: rbx
24
- gemfile: gemfiles/Gemfile.rails-4.0
25
- env: ADAPTER=mongoid
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
@@ -12,8 +12,10 @@ group :test do
12
12
  else
13
13
  raise "Unknown model adapter: #{ENV["ADAPTER"]}"
14
14
  end
15
-
15
+
16
16
  gem 'coveralls', :require => false
17
+ gem 'its'
18
+ gem 'pry'
17
19
  end
18
20
 
19
- gemspec
21
+ gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # rolify [![Gem Version](https://badge.fury.io/rb/rolify.png)](http://badge.fury.io/rb/rolify) [![build status](https://secure.travis-ci.org/EppO/rolify.png)](http://travis-ci.org/EppO/rolify) [![dependency status](https://gemnasium.com/EppO/rolify.png)](https://gemnasium.com/EppO/rolify) [![Code Climate](https://codeclimate.com/github/EppO/rolify.png)](https://codeclimate.com/github/EppO/rolify) [![Coverage Status](https://coveralls.io/repos/EppO/rolify/badge.png?branch=master)](https://coveralls.io/r/EppO/rolify)
1
+ # rolify [![Gem Version](https://badge.fury.io/rb/rolify.png)](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/EppO/rolify.png)](https://gemnasium.com/EppO/rolify) [![Code Climate](https://codeclimate.com/github/EppO/rolify.png)](https://codeclimate.com/github/EppO/rolify) [![Coverage Status](https://coveralls.io/repos/EppO/rolify/badge.png?branch=master)](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 = "spec/generators/**/*_spec.rb"
10
+ task.pattern = 'spec/generators/**/*_spec.rb'
11
11
  end
12
12
 
13
13
  RSpec::Core::RakeTask.new(:rolify) do |task|
14
- task.pattern = "spec/rolify/**/*_spec.rb"
14
+ task.pattern = 'spec/rolify/**/*_spec.rb'
15
15
  end
16
16
 
17
17
  task :default => [ :spec, 'coveralls:push' ]
18
18
 
19
- desc "Run all specs"
20
- task "spec" do
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 "Run specs for all adapters"
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
@@ -1,27 +1,26 @@
1
- source "https://rubygems.org"
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
- case ENV["ADAPTER"]
14
- when nil, "active_record"
15
- gem "activerecord-jdbcsqlite3-adapter", ">= 1.3.0.rc", :platform => "jruby"
16
- gem "sqlite3", :platform => "ruby"
17
- gem "activerecord", ">= 3.2.0", :require => "active_record"
18
- when "mongoid"
19
- gem "mongoid", ">= 3.1"
20
- gem "bson_ext", :platform => "ruby"
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["ADAPTER"]}"
21
+ raise "Unknown model adapter: #{ENV['ADAPTER']}"
23
22
  end
24
-
23
+
25
24
  gem 'coveralls', :require => false
26
25
  end
27
26
 
@@ -1,34 +1,33 @@
1
- source "https://rubygems.org"
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 "rails", "~> 4.0.1"
14
- gem "ammeter"
15
- gem "rake"
16
- gem "rspec"
17
- gem "rspec-rails"
18
- gem "fuubar"
19
- gem "bundler"
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["ADAPTER"]
24
- when nil, "active_record"
25
- gem "activerecord", "~> 4.0.1", :require => "active_record"
26
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.5", :platform => "jruby"
27
- gem "sqlite3", :platform => "ruby"
28
- when "mongoid"
29
- gem "mongoid", github: 'mongoid/mongoid'
30
- gem "bson_ext", :platform => "ruby"
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["ADAPTER"]}"
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
- resources = relation.joins("INNER JOIN #{quote(roles_table)} ON #{quote(roles_table)}.resource_type = '#{relation.to_s}' AND
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 = ?", Array(role_name), relation.to_s)
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(:id)
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
- ActiveRecord::Base.connection.quote_column_name column
43
+ ActiveRecord::Base.connection.quote_column_name column
23
44
  end
24
45
  end
25
46
  end
@@ -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.to_s)
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
@@ -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" && !role_class.table_exists?
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
@@ -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
- roles = user && (user != :any) ? user.roles : self.role_class
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
- resources = self.adapter.resources_find(self.role_table_name, self, role_name)
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