third-prestige-rolify 3.3.0.rc5

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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +17 -0
  4. data/CHANGELOG.rdoc +157 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +20 -0
  7. data/README.md +220 -0
  8. data/Rakefile +34 -0
  9. data/UPGRADE.rdoc +44 -0
  10. data/gemfiles/Gemfile.rails-3.2 +21 -0
  11. data/gemfiles/Gemfile.rails-4.0 +27 -0
  12. data/lib/generators/active_record/rolify_generator.rb +50 -0
  13. data/lib/generators/active_record/templates/README +8 -0
  14. data/lib/generators/active_record/templates/migration.rb +19 -0
  15. data/lib/generators/mongoid/rolify_generator.rb +51 -0
  16. data/lib/generators/mongoid/templates/README-mongoid +4 -0
  17. data/lib/generators/rolify/rolify_generator.rb +35 -0
  18. data/lib/generators/rolify/templates/README +13 -0
  19. data/lib/generators/rolify/templates/initializer.rb +8 -0
  20. data/lib/generators/rolify/templates/role-active_record.rb +11 -0
  21. data/lib/generators/rolify/templates/role-mongoid.rb +17 -0
  22. data/lib/generators/rolify/user_generator.rb +39 -0
  23. data/lib/rolify.rb +57 -0
  24. data/lib/rolify/adapters/active_record/resource_adapter.rb +26 -0
  25. data/lib/rolify/adapters/active_record/role_adapter.rb +86 -0
  26. data/lib/rolify/adapters/active_record/scopes.rb +27 -0
  27. data/lib/rolify/adapters/base.rb +60 -0
  28. data/lib/rolify/adapters/mongoid/resource_adapter.rb +27 -0
  29. data/lib/rolify/adapters/mongoid/role_adapter.rb +89 -0
  30. data/lib/rolify/adapters/mongoid/scopes.rb +27 -0
  31. data/lib/rolify/configure.rb +56 -0
  32. data/lib/rolify/dynamic.rb +21 -0
  33. data/lib/rolify/finders.rb +40 -0
  34. data/lib/rolify/matchers.rb +13 -0
  35. data/lib/rolify/railtie.rb +20 -0
  36. data/lib/rolify/resource.rb +31 -0
  37. data/lib/rolify/role.rb +85 -0
  38. data/lib/rolify/utils.rb +10 -0
  39. data/lib/rolify/version.rb +3 -0
  40. data/rolify.gemspec +30 -0
  41. data/spec/README.rdoc +24 -0
  42. data/spec/generators/rolify/rolify_activerecord_generator_spec.rb +163 -0
  43. data/spec/generators/rolify/rolify_mongoid_generator_spec.rb +112 -0
  44. data/spec/generators_helper.rb +21 -0
  45. data/spec/rolify/config_spec.rb +191 -0
  46. data/spec/rolify/custom_spec.rb +20 -0
  47. data/spec/rolify/matchers_spec.rb +24 -0
  48. data/spec/rolify/namespace_spec.rb +24 -0
  49. data/spec/rolify/resource_spec.rb +389 -0
  50. data/spec/rolify/resourcifed_and_rolifed_spec.rb +24 -0
  51. data/spec/rolify/role_spec.rb +20 -0
  52. data/spec/rolify/shared_contexts.rb +92 -0
  53. data/spec/rolify/shared_examples/shared_examples_for_add_role.rb +92 -0
  54. data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +65 -0
  55. data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +151 -0
  56. data/spec/rolify/shared_examples/shared_examples_for_finders.rb +77 -0
  57. data/spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb +71 -0
  58. data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +71 -0
  59. data/spec/rolify/shared_examples/shared_examples_for_has_role.rb +135 -0
  60. data/spec/rolify/shared_examples/shared_examples_for_only_has_role.rb +174 -0
  61. data/spec/rolify/shared_examples/shared_examples_for_remove_role.rb +121 -0
  62. data/spec/rolify/shared_examples/shared_examples_for_roles.rb +102 -0
  63. data/spec/rolify/shared_examples/shared_examples_for_scopes.rb +38 -0
  64. data/spec/spec_helper.rb +30 -0
  65. data/spec/support/adapters/active_record.rb +76 -0
  66. data/spec/support/adapters/mongoid.rb +143 -0
  67. data/spec/support/adapters/mongoid.yml +6 -0
  68. data/spec/support/data.rb +25 -0
  69. data/spec/support/schema.rb +52 -0
  70. metadata +254 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2db18461c5d4b36fba759899728a36106c6a6591
4
+ data.tar.gz: bded9de6408ca7582da1d41125633f92d72d9441
5
+ SHA512:
6
+ metadata.gz: 6fae547b69f1c7f89a3fca11735dd153826ed6f477773bb95ac76bc46829493e791f7cf85a2eeefa5bd7847c10a08d4c7a627f76cc120e8655af138fe6f5f889
7
+ data.tar.gz: 55ad679b5c49555ee6124a6e36f5e39c93bc2a02d224765e8db6a4732d736b680c06d5bdf843ee277e3671ce70034001e8dffb5c1ad0adb9c5f59d455c092d3e
@@ -0,0 +1,10 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ gemfiles/*.lock
5
+ pkg/*
6
+ tmp/*
7
+ coverage/*
8
+ log*/*
9
+ .rbx/*
10
+ .rspec
@@ -0,0 +1,17 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 2.0.0
4
+ - rbx-19mode
5
+ - jruby-19mode
6
+
7
+ gemfile:
8
+ - gemfiles/Gemfile.rails-3.2
9
+ - gemfiles/Gemfile.rails-4.0
10
+
11
+ env:
12
+ - ADAPTER=active_record
13
+ - ADAPTER=mongoid
14
+
15
+ services: mongodb
16
+
17
+ before_script: rails --version
@@ -0,0 +1,157 @@
1
+ = 3.3 (not released yet)
2
+ * <b>DEPRECATION NOTICE:</b>Rails 3.1 support dropped: if you use Rails 3.1, please stick to rolify 3.2
3
+ * code cleanup in finders methods
4
+ * generators rewritten entirely. now using ActiveRecord/Mongoid model generator to create Role model
5
+ * added rspec matchers for detailed spec error messages (thanks to @delwyn)
6
+ * clean up specs (thanks to @delwyn), removed subject and let declarations in before(:all) block
7
+ * roles query needs 1 DB hit instead of 1 up to 3 (thanks to @terraplane)
8
+ * remove nil entries from ResourceAdapter#resources_find when using Mongoid adapter (thanks to @daviscabral)
9
+ * fixed a bug regarding redundant index for Mongoid Role model (thanks to @rschultheis)
10
+ * added support for rolify and resourcify methods on the same model class (specs by @amer)
11
+ * added support for namespaced models (thanks to @intrica)
12
+ * fixed compatibility issue with squeel when using symbols as role parameters (hint by @f3ndot)
13
+ * now raises a warning in the initializer if migration has not been run
14
+ * add support for primary key different than 'id' for resource Model (thanks to @rafaeldl)
15
+ * Rails 4 (thanks to @adammathys) and ruby 2.0 compliant
16
+ * configured travis-ci to run the specs on Rails 3.2/4.0 and Rubies 1.9.3/2.0/rbx/jruby
17
+ * added code climate to check for code smell
18
+
19
+ = 3.2 (Aug 7, 2012)
20
+ * <b>DEPRECATION NOTICE:</b> Ruby 1.8 support dropped ! Mongoid 3.0 only supports MRI 1.9.3, and HEAD, and JRuby 1.6.0+ in 1.9 mode
21
+ * removed <tt>dynamic_shortcuts</tt> arguments from the generator
22
+ * to use dynamic shortcuts feature when you're using ActiveRecord, you have to enable it _after_ running rake db:migrate as it relies on the roles table
23
+ * support for Mongoid 3.x (thanks to @Leonas)
24
+ * new class methods on the User class to find users depending on roles they have
25
+ * added scopes to Role class to be able to fetch global, class scoped and instance scoped roles for a specific user
26
+ * deletions of n-n relation are unreliable with Mongoid. Removing ids instead (thanks to @nfo)
27
+ * <tt>has_role?</tt> method now supports new instance (i.e. record not saved in the database yet) (thanks to @demental)
28
+ * added association callbacks <tt>(before|after)_add</tt>, <tt>(before|after)_remove</tt> on <tt>rolify</tt> method (thanks to @shekibobo)
29
+ * added ability to pass an array of roles to <tt>Resource.with_role()</tt>, aliased by <tt>Resource.with_roles()</tt> (thanks to @lukes)
30
+ * added option to have roles be destroyed by default if parent resource is destroyed (thanks to @treydock)
31
+ * added new method <tt>only_has_role?</tt> to check if user has only a specific role (thanks to @jalcine)
32
+ * better edge cases covering in the specs
33
+ * fixed a bug regarding the loading order of the railtie when using Mongoid ORM and other gems using initializer files (thanks to @stigi)
34
+ * fixed double quote syntax when using MySQL
35
+ * fixed a nasty bug regarding class level queries (thanks to @kamrulhassan)
36
+ * fixed uninitialized constant error in scopify method
37
+ * documentation improvement
38
+
39
+ = 3.1 (Apr 6, 2012)
40
+ * Mongoid adapter optimization
41
+ * adapter code refactoring
42
+ * generator now adds the role class name to the rolify method injected in the user class
43
+ * fixed a bug on the generator when using a 2 words Camel case for the Role class name
44
+ * <b>DEPRECATION NOTICE:</b> <tt>has_role</tt> and <tt>has_no_role</tt> have been depecrated. They are replaced by <tt>add_role</tt> and <tt>remove_role</tt>
45
+ * some internals cleanup (backward compatible)
46
+ * stop requiring <tt>active_record</tt> in <tt>rolify.rb</tt> to prevent other gems ORM detection issue
47
+ * fixed a bug when removing a role to the user using Mongoid adapter
48
+ * added indexes to generator for mongoid (thanks to @stigi)
49
+ * fixed a bug regarding **with_role** method on resource classes (thanks to @nfo)
50
+
51
+ = 3.0 (Apr 2, 2012)
52
+ * support for Mongoid
53
+ * roles search on resources on instance level (e.g. <tt>Forum.first.roles</tt>) and class level (e.g. <tt>Forum.with_role("admin", user)</tt>)
54
+ * heavy lifting and redesign of the library, code and specs refactoring
55
+ * enhanced drastically specs coverage: 1001 examples !
56
+
57
+ = 2.2.2 (Feb 17, 2012)
58
+ * fixed another bug occurring when dynamic shortcuts is enabled
59
+ * display now a README file after running the generator to show the next setup steps
60
+
61
+ = 2.2.1 (Jan 24, 2012)
62
+ * fixed a backward incompatible change introduced in Rails 3.2 release (<tt>find_or_create_by_* generated methods</tt>)
63
+
64
+ = 2.2 (Jan 18, 2012)
65
+ * fixed a bug in the initializer file regarding dynamic shortcuts
66
+
67
+ = 2.1 (Nov 30, 2011)
68
+ * added syntactic sugar: <tt>grant</tt> and <tt>revoke</tt> are aliases for <tt>has_role</tt> and <tt>has_no_role</tt>
69
+ * check if RUBY_ENGINE is defined in the gemspec to be able to use jdbc with JRuby for SQLite
70
+
71
+ = 2.0 (Nov 10, 2011)
72
+ * improved performance of <tt>has_all_roles?</tt> method using one single DB query instead of doing one DB lookup per argument
73
+ * significant speed-up when requesting with many arguments
74
+ * database choice can mitigate the results
75
+ * clean up the initializer code
76
+ * using a DSL to configure the library
77
+ * setting defaults for User and Role classes
78
+ * dynamic shortcuts feature is now <b>disabled</b> by default. To turn it on:
79
+ * set it to true in the initializer file
80
+ * uncomment the <tt>extend Rolify::Dynamic</tt> line in the User class
81
+ * detecting if it's loaded by Rails::Server or Rails::Console
82
+ * now also running on Rubinius, JRuby, REE and Ruby 1.8. all specs pass successfully, yeah !
83
+
84
+ = 1.2 (Nov 4, 2011)
85
+ * fixed a strange bug, probably rails related (thanks to @scottkf)
86
+ * when using rails in development mode, the <tt>config.cache_classes = false</tt> makes the role class to be loaded at every call and can lead to a <tt>AssociationTypeMismatch</tt>
87
+ * use of <tt>role_ids</tt> array instead of the <tt>roles</tt> association
88
+ * now running on JRuby (<b>specs are still failing for JRuby though</b>)
89
+
90
+ = 1.1 (Oct 14, 2011)
91
+ * added a spec to test the rails generator using ammeter gem
92
+ * Gemfile cleanup, moved all dependencies in gemspec instead
93
+ * edited the dependency to Rails 3.1 and newer, now that Rails 3.1 has been released
94
+ * new role scoping capabilities
95
+ * instance level : <tt>user.has_role "moderator", Forum.first</tt> (<em>already supported in previous release</em>). user has the moderator role only on that Forum in particular
96
+ * class level : <tt>user.has_role "moderator", Forum</tt>. User has the moderator role on all instances of Forum
97
+ * global level : <tt>user.has_role "moderator"</tt> (<em>already supported in previous release</em>). User has the moderator role globally (e.q. on all resources)
98
+ * new scoped query capabilities
99
+ * <tt>user.has_role? "moderator", Forum.first</tt> (<em>already supported in previous release</em>). asks if the user has the moderator role on Forum.first instance
100
+ * <tt>user.has_role? "moderator", Forum</tt>. asks if the user has the moderator role on all Forum instances
101
+ * <tt>user.has_role? "moderator"</tt> (<em>already supported in previous release</em>). asks if the user has the global moderator role
102
+ * <tt>user.has_role? "moderator", :any</tt>. asks if the user has at least one moderator role no matter the scope is (instance, class or global).
103
+
104
+ = 1.0 (Aug 25, 2011)
105
+ * added a new parameter to disable dynamic shortcut methods due to potential incompatibility with other gems using method_missing with the same pattern
106
+ * add <tt>Rolify.dynamic_shortcuts = false</tt> in the initializer file or
107
+ * use the generator command with a third parameter:
108
+ * <tt>rails g rolify:role Role User false</tt>
109
+ * removed the railtie as it created more problems than it solved
110
+ * code refactoring to do some speed improvements and code clean up
111
+ * added a lot of specs to improve tests coverage
112
+ * wrote a tutorial showing how to use rolify with CanCan and Devise
113
+ * rolify is now on travis-ci to monitor build status
114
+
115
+ = 0.7 (June 20, 2011)
116
+ * added a method_missing to catch newly created role outside the current ruby process (i.e. dynamic shortcut methods are not defined within this process)
117
+ * dynamic shortcut is created on the fly in the method_missing to avoid extra method_missing for the same dynamic shortcut
118
+ * check if the role actually exists in the database before defining the new method
119
+ * first call is slower due to method_missing but next calls are fast
120
+ * avoid strange bugs when spawning many ruby processes as the dynamic shortcut methods were only defined in the process that used the <tt>has_role</tt> command
121
+
122
+ = 0.6 (June 19, 2011)
123
+ * custom User and Role class names support
124
+ * can now use other class names for Role and User classes
125
+ * fixed generators and templates
126
+ * join table is explicitly set to avoid alphabetical order issue
127
+ * created a new railtie to load the dynamic shortcuts at startup
128
+
129
+ = 0.5.1 (June 07, 2011)
130
+ * fixed a nasty typo on a variable name and added a spec to make it never happen again
131
+
132
+ = 0.5 (June 07, 2011)
133
+ * dynamic shortcuts support
134
+ * creates automatically new methods upon new role creation (or at startup for a Rails app)
135
+ * <tt>has_role "admin"</tt> will create a method called <tt>is_admin?</tt>
136
+ * <tt>has_role "moderator", Forum.first</tt> will create 2 methods:
137
+ * <tt>is_moderator_of?(resource)</tt>
138
+ * <tt>is_moderator?</tt>
139
+
140
+ = v0.4 (June 07, 2011)
141
+ * removing role support
142
+ * <tt>has_no_role</tt> removes a global role or a role scoped to a resource
143
+ * Please note that trying to remove a global role whereas the user a role with the same name on a resource will remove that scoped role
144
+ * Trying to remove a role scoped to a resource whereas the user has a global role won't remove it
145
+
146
+ = v0.3 (June 06, 2011)
147
+ * multiple roles check:
148
+ * <tt>has_all_roles?</tt> returns true if the user has ALL the roles in arguments
149
+ * <tt>has_any_role?</tt> returns true if the user has ANY the roles in arguments
150
+
151
+ = v0.2 (June 04, 2011)
152
+ * fixed the generator to include the lib
153
+ * fixed the migration file with missing polymorphic field
154
+ * added some examples in documentation
155
+
156
+ = v0.1 (June 04, 2011)
157
+ * first release
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ source "https://rubygems.org"
2
+
3
+ case ENV["ADAPTER"]
4
+ when nil, "active_record"
5
+ group :test do
6
+ gem "activerecord-jdbcsqlite3-adapter", ">= 1.3.0.rc", :platform => "jruby"
7
+ gem "sqlite3", :platform => "ruby"
8
+ end
9
+ gem "activerecord", ">= 3.2.0", :require => "active_record"
10
+ when "mongoid"
11
+ gem "mongoid", ">= 3.1"
12
+ gem "bson_ext", :platform => "ruby"
13
+ else
14
+ raise "Unknown model adapter: #{ENV["ADAPTER"]}"
15
+ end
16
+
17
+ group :test do
18
+ gem 'coveralls', :require => false
19
+ end
20
+
21
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Florent Monbillard
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,220 @@
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)
2
+
3
+
4
+ Very simple Roles library without any authorization enforcement supporting scope on resource object.
5
+
6
+ Let's see an example:
7
+
8
+ ```ruby
9
+ user.has_role?(:moderator, Forum.first)
10
+ => false # if user is moderator of another Forum
11
+ ```
12
+
13
+ This library can be easily integrated with any authentication gem ([devise](https://github.com/plataformatec/devise), [Authlogic](https://github.com/binarylogic/authlogic), [Clearance](https://github.com/thoughtbot/clearance)) and authorization gem<span style="color: red"><strong>*</strong></span> ([CanCan](https://github.com/ryanb/cancan), [authority](https://github.com/nathanl/authority))
14
+
15
+ <span style="color: red"><strong>*</strong></span>: authorization gem that doesn't provide a role class
16
+
17
+ ## Requirements
18
+
19
+ * Rails >= 3.2
20
+ * ActiveRecord >= 3.2 <b>or</b> Mongoid >= 3.1
21
+ * supports ruby 2.0/1.9.3, JRuby 1.6.0+ (in 1.9 mode) and Rubinius 2.0.0dev (in 1.9 mode)
22
+ * support of ruby 1.8 has been dropped due to Mongoid >=3.0 that only supports 1.9 new hash syntax
23
+
24
+ ## Installation
25
+
26
+ In <b>Rails 3</b>, add this to your Gemfile and run the +bundle+ command.
27
+
28
+ ```ruby
29
+ gem "rolify"
30
+ ```
31
+
32
+ ## Getting Started
33
+
34
+ ### 1. Generate Role Model
35
+
36
+ First, create your Role model and migration file using this generator:
37
+
38
+ ```
39
+ rails g rolify Role User
40
+ ```
41
+
42
+ **NB** for versions of Rolify prior to 3.3, use:
43
+
44
+ ```
45
+ rails g rolify:role Role User
46
+ ```
47
+
48
+ Role and User classes are the default. You can specify any Role class name you want. This is completly a new file so any name can do the job.
49
+ For the User class name, you would probably use the one provided by your authentication solution. rolify just adds some class methods in an existing User class.
50
+
51
+ If you want to use Mongoid instead of ActiveRecord, just add `--orm=mongoid` argument, and skip to step #3
52
+
53
+ ### 2. Run the migration (only required when using ActiveRecord)
54
+
55
+ Let's migrate !
56
+
57
+ ```
58
+ rake db:migrate
59
+ ```
60
+
61
+ ### 3.1 Configure your user model
62
+
63
+ This gem adds the `rolify` method to your User class. You can also specify optional callbacks on the User class for when roles are added or removed:
64
+
65
+ ```ruby
66
+ class User < ActiveRecord::Base
67
+ rolify :before_add => :before_add_method
68
+
69
+ def before_add_method(role)
70
+ # do something before it gets added
71
+ end
72
+ end
73
+ ```
74
+
75
+ The `rolify` method accepts the following callback options:
76
+
77
+ - `before_add`
78
+ - `after_add`
79
+ - `before_remove`
80
+ - `after_remove`
81
+
82
+ Mongoid callbacks are also supported and works the same way.
83
+
84
+ ### 3.2 Configure your resource models
85
+
86
+ In the resource models you want to apply roles on, just add ``resourcify`` method.
87
+ For example, on this ActiveRecord class:
88
+
89
+ ```ruby
90
+ class Forum < ActiveRecord::Base
91
+ resourcify
92
+ end
93
+ ```
94
+
95
+ ### 4. Add a role to a user
96
+
97
+ To define a global role:
98
+
99
+ ```ruby
100
+ user = User.find(1)
101
+ user.add_role :admin
102
+ ```
103
+
104
+ To define a role scoped to a resource instance
105
+
106
+ ```ruby
107
+ user = User.find(2)
108
+ user.add_role :moderator, Forum.first
109
+ ```
110
+
111
+ To define a role scoped to a resource class
112
+
113
+ ```ruby
114
+ user = User.find(3)
115
+ user.add_role :moderator, Forum
116
+ ```
117
+
118
+ That's it !
119
+
120
+ ### 5. Role queries
121
+
122
+ To check if a user has a global role:
123
+
124
+ ```ruby
125
+ user = User.find(1)
126
+ user.add_role :admin # sets a global role
127
+ user.has_role? :admin
128
+ => true
129
+ ```
130
+
131
+ To check if a user has a role scoped to a resource instance:
132
+
133
+ ```ruby
134
+ user = User.find(2)
135
+ user.add_role :moderator, Forum.first # sets a role scoped to a resource instance
136
+ user.has_role? :moderator, Forum.first
137
+ => true
138
+ user.has_role? :moderator, Forum.last
139
+ => false
140
+ ```
141
+
142
+ To check if a user has a role scoped to a resource class:
143
+
144
+ ```ruby
145
+ user = User.find(3)
146
+ user.add_role :moderator, Forum # sets a role scoped to a resource class
147
+ user.has_role? :moderator, Forum
148
+ => true
149
+ user.has_role? :moderator, Forum.first
150
+ => true
151
+ user.has_role? :moderator, Forum.last
152
+ => true
153
+ ```
154
+
155
+ A global role overrides resource role request:
156
+
157
+ ```ruby
158
+ user = User.find(4)
159
+ user.add_role :moderator # sets a global role
160
+ user.has_role? :moderator, Forum.first
161
+ => true
162
+ user.has_role? :moderator, Forum.last
163
+ => true
164
+ ```
165
+
166
+ ### 6. Resource roles querying
167
+
168
+ Starting from rolify 3.0, you can search roles on instance level or class level resources.
169
+
170
+ #### Instance level
171
+
172
+ ```ruby
173
+ forum = Forum.first
174
+ forum.roles
175
+ # => [ list of roles that are only binded to forum instance ]
176
+ forum.applied_roles
177
+ # => [ list of roles binded to forum instance and to the Forum class ]
178
+ ```
179
+
180
+ #### Class level
181
+
182
+ ```ruby
183
+ Forum.with_role(:admin)
184
+ # => [ list of Forum instances that has role "admin" binded to it ]
185
+ Forum.with_role(:admin, current_user)
186
+ # => [ list of Forum instances that has role "admin" binded to it and belongs to current_user roles ]
187
+
188
+ User.with_any_role(:user, :admin)
189
+ # => [ list of User instances that has role "admin" or "user" binded to it ]
190
+
191
+ Forum.find_roles
192
+ # => [ list of roles that binded to any Forum instance or to the Forum class ]
193
+ Forum.find_roles(:admin)
194
+ # => [ list of roles that binded to any Forum instance or to the Forum class with "admin" as a role name ]
195
+ Forum.find_roles(:admin, current_user)
196
+ # => [ list of roles that binded to any Forum instance or to the Forum class with "admin" as a role name and belongs to current_user roles ]
197
+ ```
198
+
199
+ ## Resources
200
+
201
+ * [Wiki](https://github.com/EppO/rolify/wiki)
202
+ * [Usage](https://github.com/EppO/rolify/wiki/Usage): all the available commands
203
+ * [Tutorials](https://github.com/EppO/rolify/wiki#wiki-tutorials):
204
+ * [How-To use rolify with Devise and CanCan](https://github.com/EppO/rolify/wiki/Tutorial)
205
+ * [Using rolify with Devise and Authority](https://github.com/EppO/rolify/wiki/Using-rolify-with-Devise-and-Authority)
206
+ * [Step-by-step tutorial](http://railsapps.github.com/tutorial-rails-bootstrap-devise-cancan.html) provided by [RailsApps](http://railsapps.github.com/)
207
+
208
+ ## Upgrade from previous versions
209
+
210
+ Please read the [upgrade instructions](UPGRADE.rdoc).
211
+
212
+ ## Known issues
213
+
214
+ If you are using Mongoid and/or less-rails gem, please read [this](https://github.com/EppO/rolify/wiki/FAQ#when-i-start-rails-using-server-console-whatever-i-get-this-error)
215
+
216
+ ## Questions or Problems?
217
+
218
+ If you have any issue or feature request with/for rolify, please create an new [issue on GitHub](https://github.com/EppO/rolify/issues) **specifying the ruby runtime, rails and rolify versions you're using and the gems listed in your Gemfile**, or fork the project and send a pull request.
219
+
220
+ To get the specs running you should call `bundle` and then `rake`. See the spec/README for more information.