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.
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