roles_generic 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +125 -0
- data/Rakefile +6 -6
- data/VERSION +1 -1
- data/lib/generators/roles_generic/roles/roles_generator.rb +1 -1
- data/lib/roles_generic/base.rb +3 -3
- data/lib/roles_generic/generic/user.rb +13 -3
- data/lib/roles_generic/generic.rb +45 -4
- data/lib/roles_generic/rspec/api/full.rb +3 -3
- data/lib/roles_generic/rspec/api/read_api.rb +56 -56
- data/lib/roles_generic/strategy/multi/embed_many_roles.rb +30 -0
- data/lib/roles_generic/strategy/single/embed_one_role.rb +38 -0
- data/lib/roles_generic/strategy.rb +7 -2
- data/roles_generic.gemspec +97 -97
- data/spec/roles_generic/strategy/multi/many_roles_spec.rb +1 -3
- data/spec/roles_generic/strategy/multi/role_strings_spec.rb +1 -3
- data/spec/roles_generic/strategy/multi/roles_mask_spec.rb +1 -3
- data/spec/roles_generic/strategy/multi/roles_string_spec.rb +1 -3
- data/spec/roles_generic/strategy/single/admin_flag_spec.rb +1 -3
- data/spec/roles_generic/strategy/single/one_role_spec.rb +1 -4
- data/spec/roles_generic/strategy/single/role_string_spec.rb +1 -3
- metadata +20 -17
- data/.gitignore +0 -21
- data/README.markdown +0 -178
data/README.textile
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
h1. Generic Roles
|
2
|
+
|
3
|
+
*Generic Roles* is a generic Roles API implementation that specific ORM Roles implementations can implement.
|
4
|
+
This way you can easily change ORM and still keep the same underlying API.
|
5
|
+
|
6
|
+
A Rails 3 generator is included that can configure an existing User model with a generic Role strategy of choice.
|
7
|
+
Each ORM Roles implementation should have a similar generator for that particular ORM.
|
8
|
+
|
9
|
+
h2. Roles ORM implementations
|
10
|
+
|
11
|
+
The following ORM specific Roles implementations are currently available
|
12
|
+
|
13
|
+
h3. Relational Database (SQL)
|
14
|
+
|
15
|
+
* "Active Record":http://github.com/kristianmandrup/roles_active_record
|
16
|
+
* "Data Mapper":http://github.com/kristianmandrup/roles_data_mapper
|
17
|
+
|
18
|
+
h3. Mongo DB
|
19
|
+
|
20
|
+
* "Mongoid":(http://github.com/kristianmandrup/roles_mongoid
|
21
|
+
* "Mongo Mapper":http://github.com/kristianmandrup/roles_mongo_mapper
|
22
|
+
|
23
|
+
h3. Couch DB
|
24
|
+
|
25
|
+
* "Simply Stored":http://github.com/kristianmandrup/roles_simply_stored
|
26
|
+
|
27
|
+
_Note:_
|
28
|
+
|
29
|
+
The 'simply_stored' implementation is only partly complete (admin_flag strategy works).
|
30
|
+
Feel free to roll your own implementation for your favorite ORM/Data store.
|
31
|
+
|
32
|
+
h2. Install
|
33
|
+
|
34
|
+
<code>gem install roles_generic</code>
|
35
|
+
|
36
|
+
h2. Role strategy configuration
|
37
|
+
|
38
|
+
The following demonstrates some examples of role strategy configuration.
|
39
|
+
|
40
|
+
_Note_: The DSL has been optimized a bit lately (Dec. 25)
|
41
|
+
|
42
|
+
h3. Strategy: admin_flag
|
43
|
+
|
44
|
+
Example: Default model configuration:
|
45
|
+
|
46
|
+
<pre>class User
|
47
|
+
include Roles::Generic
|
48
|
+
|
49
|
+
strategy :admin_flag
|
50
|
+
valid_roles_are :admin, :guest
|
51
|
+
...
|
52
|
+
end
|
53
|
+
</pre>
|
54
|
+
|
55
|
+
h3. Strategy: one_role
|
56
|
+
|
57
|
+
Example: Customizing model names:
|
58
|
+
|
59
|
+
<pre>class Bruger
|
60
|
+
include Roles::Generic
|
61
|
+
|
62
|
+
strategy :one_role, :role_class => :rolle
|
63
|
+
valid_roles_are :admin, :guest
|
64
|
+
...
|
65
|
+
end
|
66
|
+
</pre>
|
67
|
+
|
68
|
+
Here the Role class is configured to be named 'Rolle' (Danish translation).
|
69
|
+
If no :role_class options is passed, the default role class 'Role' is used (if the Role class is defined).
|
70
|
+
|
71
|
+
Note: The customizing of the Role class model is not yet complete. The generator and such still needs to be updated... Feel free to assist!
|
72
|
+
|
73
|
+
h2. Roles generator
|
74
|
+
|
75
|
+
A Rails 3 generator is included to update an existing User model with a roles strategy and a set of valid roles.
|
76
|
+
The Generic Roles generator doesn't work for a persistent model. In that case use a dedicated implementation for the ORM (data store) used (see above).
|
77
|
+
|
78
|
+
h3. Usage example
|
79
|
+
|
80
|
+
<code>rails g roles_generic:roles --strategy admin_flag --roles guest admin</code>
|
81
|
+
|
82
|
+
h2. Role strategies
|
83
|
+
|
84
|
+
The following role strategies are built-in:
|
85
|
+
|
86
|
+
Inline roles (attribute in User model):
|
87
|
+
|
88
|
+
* _admin_flag_ (Boolean flag - 'admin' or not)
|
89
|
+
* _role_string_ (String)
|
90
|
+
* _roles_string_ (comma separated String)
|
91
|
+
* _role_strings_ (list of Strings)
|
92
|
+
* _roles_mask_ (Integer mask)
|
93
|
+
|
94
|
+
Separate Role model:
|
95
|
+
|
96
|
+
* _one_role_ (single relation to a Role model instance)
|
97
|
+
* _many_roles_ (multiple Role relationships)
|
98
|
+
|
99
|
+
Embedded Role model (Document stores only):
|
100
|
+
|
101
|
+
* _embed_one_role_
|
102
|
+
* _embed_many_roles_
|
103
|
+
|
104
|
+
Currently the embedded strategies have only been implemented for Mongoid.
|
105
|
+
|
106
|
+
h2. Role API
|
107
|
+
|
108
|
+
The full Roles API is described in these Wiki pages:
|
109
|
+
|
110
|
+
* "Roles-Read-API":https://github.com/kristianmandrup/roles_generic/wiki/Roles-Read-API
|
111
|
+
* "Roles-Write-API":https://github.com/kristianmandrup/roles_generic/wiki/Roles-Write-API
|
112
|
+
|
113
|
+
h2. Note on Patches/Pull Requests
|
114
|
+
|
115
|
+
* Fork the project.
|
116
|
+
* Make your feature addition or bug fix.
|
117
|
+
* Add tests for it. This is important so I don't break it in a
|
118
|
+
future version unintentionally.
|
119
|
+
* Commit, do not mess with rakefile, version, or history.
|
120
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
121
|
+
* Send me a pull request. Bonus points for topic branches.
|
122
|
+
|
123
|
+
h2. Copyright
|
124
|
+
|
125
|
+
Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -5,15 +5,15 @@ begin
|
|
5
5
|
gem.summary = %Q{Generic role strategies sharing the same API}
|
6
6
|
gem.description = %Q{Generic role strategies sharing the same API. Easy to insert in any model}
|
7
7
|
gem.email = "kmandrup@gmail.com"
|
8
|
-
gem.homepage = "http://github.com/kristianmandrup/
|
8
|
+
gem.homepage = "http://github.com/kristianmandrup/roles_generic"
|
9
9
|
gem.authors = ["Kristian Mandrup"]
|
10
|
-
gem.add_development_dependency "rspec", ">= 2.0.
|
11
|
-
gem.add_development_dependency "generator-spec", ">= 0.7"
|
10
|
+
gem.add_development_dependency "rspec", ">= 2.0.1"
|
11
|
+
gem.add_development_dependency "generator-spec", ">= 0.7.2"
|
12
12
|
|
13
13
|
gem.add_dependency "require_all", "~> 1.2.0"
|
14
|
-
gem.add_dependency "activesupport", ">= 3.0"
|
15
|
-
gem.add_dependency 'sugar-high', "~> 0.3.
|
16
|
-
gem.add_dependency 'rails3_artifactor', '~> 0.3.
|
14
|
+
gem.add_dependency "activesupport", ">= 3.0.1"
|
15
|
+
gem.add_dependency 'sugar-high', "~> 0.3.1"
|
16
|
+
gem.add_dependency 'rails3_artifactor', '~> 0.3.2'
|
17
17
|
gem.add_dependency 'logging_assist', '>= 0.1.6'
|
18
18
|
|
19
19
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.4
|
@@ -40,7 +40,7 @@ module RolesGeneric
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def role_class_statement
|
43
|
-
[:one_role, :many_roles].include?(strategy.to_sym) ? 'role_class :role' : ''
|
43
|
+
[:one_role, :many_roles, :embed_one_role, :embed_many_roles].include?(strategy.to_sym) ? 'role_class :role' : ''
|
44
44
|
end
|
45
45
|
|
46
46
|
def roles_statement
|
data/lib/roles_generic/base.rb
CHANGED
@@ -39,7 +39,7 @@ module Roles
|
|
39
39
|
|
40
40
|
def type
|
41
41
|
@type ||= case name
|
42
|
-
when :one_role, :many_roles
|
42
|
+
when :one_role, :many_roles, :embed_one_role, :embed_many_roles
|
43
43
|
:complex
|
44
44
|
else
|
45
45
|
return :simple if name
|
@@ -48,9 +48,9 @@ module Roles
|
|
48
48
|
|
49
49
|
def multiplicity
|
50
50
|
@multiplicity ||= case name
|
51
|
-
when :many_roles, :role_strings, :roles_mask, :roles_string
|
51
|
+
when :many_roles, :role_strings, :roles_mask, :roles_string, :embed_many_roles
|
52
52
|
:multi
|
53
|
-
when :one_role, :admin_flag, :role_string
|
53
|
+
when :one_role, :admin_flag, :role_string, :embed_one_role
|
54
54
|
:single
|
55
55
|
end
|
56
56
|
end
|
@@ -12,9 +12,19 @@ module Roles::Generic
|
|
12
12
|
class << self
|
13
13
|
attr_accessor(*::Roles::Generic::User::INHERITABLE_CLASS_ATTRIBUTES)
|
14
14
|
|
15
|
-
def apply_options options
|
16
|
-
roles_attribute default_role_attribute if options
|
17
|
-
end
|
15
|
+
def apply_options options = {}
|
16
|
+
roles_attribute default_role_attribute if default_options? options
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def default_options? options
|
22
|
+
return true if options == :default
|
23
|
+
if options.kind_of? Hash
|
24
|
+
return true if options[:config] == :default || options == {}
|
25
|
+
end
|
26
|
+
false
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
@@ -12,20 +12,61 @@ module Roles
|
|
12
12
|
|
13
13
|
MAP = {
|
14
14
|
:admin_flag => "attr_accessor :admin_flag",
|
15
|
+
|
15
16
|
:many_roles => "attr_accessor :many_roles",
|
16
17
|
:one_role => "attr_accessor :one_role",
|
18
|
+
|
17
19
|
:roles_mask => "attr_accessor :roles_mask",
|
18
20
|
:role_string => "attr_accessor :role_string",
|
19
21
|
:role_strings => "attr_accessor :role_strings",
|
20
|
-
:roles_string => "attr_accessor :roles_string"
|
22
|
+
:roles_string => "attr_accessor :roles_string",
|
23
|
+
|
24
|
+
:embed_many_roles => "attr_accessor :many_roles",
|
25
|
+
:embed_one_role => "attr_accessor :one_role"
|
21
26
|
}
|
22
27
|
|
23
|
-
def strategy name, options=
|
24
|
-
|
25
|
-
|
28
|
+
def strategy name, options = {}
|
29
|
+
strategy_name = name.to_sym
|
30
|
+
raise ArgumentError, "Unknown role strategy #{strategy_name}" if !MAP.keys.include? strategy_name
|
31
|
+
use_roles_strategy strategy_name
|
32
|
+
|
33
|
+
if default_options?(options) && MAP[strategy_name]
|
34
|
+
instance_eval MAP[strategy_name]
|
35
|
+
end
|
36
|
+
|
37
|
+
if strategies_with_role_class.include? strategy_name
|
38
|
+
if !options.kind_of? Symbol
|
39
|
+
@role_class_name = get_role_class(options)
|
40
|
+
else
|
41
|
+
@role_class_name = default_role_class if strategies_with_role_class.include? strategy_name
|
42
|
+
end
|
26
43
|
end
|
44
|
+
|
27
45
|
set_role_strategy name, options
|
28
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def default_options? options = {}
|
51
|
+
return true if options == :default
|
52
|
+
if options.kind_of? Hash
|
53
|
+
return true if options[:config] == :default || options == {}
|
54
|
+
end
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
def default_role_class
|
59
|
+
return ::Role if defined? ::Role
|
60
|
+
raise Error, "Default Role class not defined"
|
61
|
+
end
|
62
|
+
|
63
|
+
def strategies_with_role_class
|
64
|
+
[:one_role, :embed_one_role, :many_roles,:embed_many_roles]
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_role_class options
|
68
|
+
options[:role_class] ? options[:role_class].to_s.camelize.constantize : default_role_class
|
69
|
+
end
|
29
70
|
end
|
30
71
|
end
|
31
72
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require "roles_generic/rspec/user_setup"
|
2
|
-
require "roles_generic/rspec/api/write_api"
|
2
|
+
# require "roles_generic/rspec/api/write_api"
|
3
3
|
require "roles_generic/rspec/api/read_api"
|
4
|
-
require "roles_generic/rspec/api/user_class_api"
|
5
|
-
require "roles_generic/rspec/api/completeness"
|
4
|
+
# require "roles_generic/rspec/api/user_class_api"
|
5
|
+
# require "roles_generic/rspec/api/completeness"
|
@@ -60,60 +60,60 @@ describe 'Roles Generic API : READ' do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
describe '#roles_list' do
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
describe '#roles' do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
describe '#admin?' do
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
describe '#is?' do
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
63
|
+
# describe '#roles_list' do
|
64
|
+
# it "should be true that the first role of admin_user is the :admin role" do
|
65
|
+
# @admin_user.roles_list.should include(:admin)
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# it "should be true that the first role of admin_user is the :user role" do
|
69
|
+
# case @normal_user.class.role_strategy.multiplicity
|
70
|
+
# when :single
|
71
|
+
# if @normal_user.class.role_strategy.name == :admin_flag
|
72
|
+
# @normal_user.roles_list.should include(:guest)
|
73
|
+
# else
|
74
|
+
# @normal_user.roles_list.should include(:user)
|
75
|
+
# end
|
76
|
+
# when :multi
|
77
|
+
# @normal_user.roles_list.should include(:user, :guest)
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# describe '#roles' do
|
83
|
+
# it "should be true that the roles of admin_user is an array with the role :admin" do
|
84
|
+
# roles = @admin_user.roles
|
85
|
+
# if roles.kind_of? Role
|
86
|
+
# roles.name.to_sym.should == :admin
|
87
|
+
# elsif roles.kind_of? Array
|
88
|
+
# if @normal_user.class.role_strategy.type == :complex
|
89
|
+
# # roles.first.name.to_sym.should == :admin
|
90
|
+
# roles.first.to_sym.should == :admin
|
91
|
+
# else
|
92
|
+
# roles.first.to_sym.should == :admin
|
93
|
+
# end
|
94
|
+
# else
|
95
|
+
# roles.to_sym.should == :admin
|
96
|
+
# end
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# describe '#admin?' do
|
101
|
+
# it "should be true that admin_user is in the :admin role" do
|
102
|
+
# @admin_user.admin?.should be_true
|
103
|
+
# end
|
104
|
+
#
|
105
|
+
# it "should NOT be true that the user is in the :admin role" do
|
106
|
+
# @guest_user.admin?.should be_false
|
107
|
+
# end
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# describe '#is?' do
|
111
|
+
# it "should be true that admin_user is in the :admin role" do
|
112
|
+
# @admin_user.is?(:admin).should be_true
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# it "should NOT be true that the user is in the :admin role" do
|
116
|
+
# @guest_user.is?(:admin).should be_false
|
117
|
+
# end
|
118
|
+
# end
|
119
119
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RoleStrategy::Generic
|
2
|
+
module EmbedManyRoles
|
3
|
+
def self.default_role_attribute
|
4
|
+
:many_roles
|
5
|
+
end
|
6
|
+
|
7
|
+
module Implementation
|
8
|
+
include Roles::Generic::User::Implementation::Multi
|
9
|
+
|
10
|
+
def new_roles *role_names
|
11
|
+
role_class.find_roles(extract_roles role_names)
|
12
|
+
end
|
13
|
+
|
14
|
+
def present_roles roles_names
|
15
|
+
roles_names.to_a.map{|role| role.name.to_s.to_sym}
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_empty_roles
|
19
|
+
self.send("#{role_attribute}=", [])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
extend Roles::Generic::User::Configuration
|
24
|
+
configure :type => :role_class
|
25
|
+
|
26
|
+
def self.included(base)
|
27
|
+
base.extend Roles::Generic::Role::ClassMethods
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RoleStrategy::Generic
|
2
|
+
module EmbedOneRole
|
3
|
+
def self.default_role_attribute
|
4
|
+
:one_role
|
5
|
+
end
|
6
|
+
|
7
|
+
module Implementation
|
8
|
+
include Roles::Generic::User::Implementation::Single
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def new_role role
|
13
|
+
role_class.find_role(role)
|
14
|
+
end
|
15
|
+
|
16
|
+
def new_roles *roles
|
17
|
+
new_role roles.flatten.first
|
18
|
+
end
|
19
|
+
|
20
|
+
def present_roles *roles
|
21
|
+
roles.map{|role| extract_role role}
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_empty_role
|
25
|
+
self.send("#{role_attribute}=", nil)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
extend Roles::Generic::User::Configuration
|
30
|
+
configure :num => :single, :type => :role_class
|
31
|
+
|
32
|
+
def self.included(base)
|
33
|
+
base.extend Roles::Generic::Role::ClassMethods
|
34
|
+
end
|
35
|
+
|
36
|
+
include Roles::Generic::User::Implementation::Single
|
37
|
+
end
|
38
|
+
end
|
@@ -3,7 +3,7 @@ require 'sugar-high/array'
|
|
3
3
|
|
4
4
|
module Roles::Strategy
|
5
5
|
class << self
|
6
|
-
NON_INLINE_STRATEGIES = [:one_role, :many_roles]
|
6
|
+
NON_INLINE_STRATEGIES = [:one_role, :many_roles, :embed_one_role, :embed_many_roles]
|
7
7
|
|
8
8
|
def role_dir
|
9
9
|
File.dirname(__FILE__)
|
@@ -12,6 +12,10 @@ module Roles::Strategy
|
|
12
12
|
def gem_name
|
13
13
|
:roles_generic
|
14
14
|
end
|
15
|
+
|
16
|
+
def embedded? strategy
|
17
|
+
strategy.to_s.include? 'embed'
|
18
|
+
end
|
15
19
|
|
16
20
|
def role_strategies cardinality
|
17
21
|
pattern = role_dir + "/strategy/#{cardinality}/*.rb"
|
@@ -41,6 +45,7 @@ def use_roles_strategy strategy
|
|
41
45
|
require "roles_generic/admin" if strategy =~ /admin/
|
42
46
|
|
43
47
|
gem_name = Roles::Strategy.gem_name
|
44
|
-
|
48
|
+
prefix = Roles::Strategy.embedded?(strategy) ? 'embedded_' : ''
|
49
|
+
require "#{gem_name}/#{prefix}role" if !Roles::Strategy.inline_strategy?(strategy)
|
45
50
|
require "#{gem_name}/strategy/#{cardinality}/#{strategy}"
|
46
51
|
end
|
data/roles_generic.gemspec
CHANGED
@@ -1,107 +1,107 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{roles_generic}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kristian Mandrup"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-12-26}
|
13
13
|
s.description = %q{Generic role strategies sharing the same API. Easy to insert in any model}
|
14
14
|
s.email = %q{kmandrup@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
17
|
+
"README.textile"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
21
|
+
".rspec",
|
22
|
+
"LICENSE",
|
23
|
+
"README.textile",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/generators/roles_generic/roles/roles_generator.rb",
|
27
|
+
"lib/roles_generic.rb",
|
28
|
+
"lib/roles_generic/admin.rb",
|
29
|
+
"lib/roles_generic/base.rb",
|
30
|
+
"lib/roles_generic/generic.rb",
|
31
|
+
"lib/roles_generic/generic/role.rb",
|
32
|
+
"lib/roles_generic/generic/role_util.rb",
|
33
|
+
"lib/roles_generic/generic/user.rb",
|
34
|
+
"lib/roles_generic/generic/user/class_methods.rb",
|
35
|
+
"lib/roles_generic/generic/user/configuration.rb",
|
36
|
+
"lib/roles_generic/generic/user/implementation.rb",
|
37
|
+
"lib/roles_generic/generic/user/multi_impl.rb",
|
38
|
+
"lib/roles_generic/generic/user/single_impl.rb",
|
39
|
+
"lib/roles_generic/namespaces.rb",
|
40
|
+
"lib/roles_generic/role.rb",
|
41
|
+
"lib/roles_generic/rspec/api/completeness.rb",
|
42
|
+
"lib/roles_generic/rspec/api/full.rb",
|
43
|
+
"lib/roles_generic/rspec/api/read_api.rb",
|
44
|
+
"lib/roles_generic/rspec/api/simple_check.rb",
|
45
|
+
"lib/roles_generic/rspec/api/user_class_api.rb",
|
46
|
+
"lib/roles_generic/rspec/api/write_api.rb",
|
47
|
+
"lib/roles_generic/rspec/test_it.rb",
|
48
|
+
"lib/roles_generic/rspec/user_setup.rb",
|
49
|
+
"lib/roles_generic/strategy.rb",
|
50
|
+
"lib/roles_generic/strategy/multi/embed_many_roles.rb",
|
51
|
+
"lib/roles_generic/strategy/multi/many_roles.rb",
|
52
|
+
"lib/roles_generic/strategy/multi/role_strings.rb",
|
53
|
+
"lib/roles_generic/strategy/multi/roles_mask.rb",
|
54
|
+
"lib/roles_generic/strategy/multi/roles_string.rb",
|
55
|
+
"lib/roles_generic/strategy/single/admin_flag.rb",
|
56
|
+
"lib/roles_generic/strategy/single/embed_one_role.rb",
|
57
|
+
"lib/roles_generic/strategy/single/one_role.rb",
|
58
|
+
"lib/roles_generic/strategy/single/role_string.rb",
|
59
|
+
"roles_generic.gemspec",
|
60
|
+
"spec/generator_spec_helper.rb",
|
61
|
+
"spec/roles_generic/generators/admin_flag_generator_spec.rb",
|
62
|
+
"spec/roles_generic/generators/many_roles_generator_spec.rb",
|
63
|
+
"spec/roles_generic/generators/one_role_generator_spec.rb",
|
64
|
+
"spec/roles_generic/generators/role_string_generator_spec.rb",
|
65
|
+
"spec/roles_generic/generators/role_strings_generator_spec.rb",
|
66
|
+
"spec/roles_generic/generators/roles_mask_generator_spec.rb",
|
67
|
+
"spec/roles_generic/generators/roles_string_generator_spec.rb",
|
68
|
+
"spec/roles_generic/strategy/multi/many_roles_spec.rb",
|
69
|
+
"spec/roles_generic/strategy/multi/role_strings_spec.rb",
|
70
|
+
"spec/roles_generic/strategy/multi/roles_mask_spec.rb",
|
71
|
+
"spec/roles_generic/strategy/multi/roles_string_spec.rb",
|
72
|
+
"spec/roles_generic/strategy/single/admin_flag_spec.rb",
|
73
|
+
"spec/roles_generic/strategy/single/one_role_spec.rb",
|
74
|
+
"spec/roles_generic/strategy/single/role_string_spec.rb",
|
75
|
+
"spec/spec_helper.rb",
|
76
|
+
"wiki/strategies/admin_flag.textile",
|
77
|
+
"wiki/strategies/many_roles.textile",
|
78
|
+
"wiki/strategies/one_role.textile",
|
79
|
+
"wiki/strategies/role_string.textile",
|
80
|
+
"wiki/strategies/role_strings.textile",
|
81
|
+
"wiki/strategies/roles_mask.textile",
|
82
|
+
"wiki/strategies/roles_string.textile"
|
82
83
|
]
|
83
|
-
s.homepage = %q{http://github.com/kristianmandrup/
|
84
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
84
|
+
s.homepage = %q{http://github.com/kristianmandrup/roles_generic}
|
85
85
|
s.require_paths = ["lib"]
|
86
86
|
s.rubygems_version = %q{1.3.7}
|
87
87
|
s.summary = %q{Generic role strategies sharing the same API}
|
88
88
|
s.test_files = [
|
89
89
|
"spec/generator_spec_helper.rb",
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
90
|
+
"spec/roles_generic/generators/admin_flag_generator_spec.rb",
|
91
|
+
"spec/roles_generic/generators/many_roles_generator_spec.rb",
|
92
|
+
"spec/roles_generic/generators/one_role_generator_spec.rb",
|
93
|
+
"spec/roles_generic/generators/role_string_generator_spec.rb",
|
94
|
+
"spec/roles_generic/generators/role_strings_generator_spec.rb",
|
95
|
+
"spec/roles_generic/generators/roles_mask_generator_spec.rb",
|
96
|
+
"spec/roles_generic/generators/roles_string_generator_spec.rb",
|
97
|
+
"spec/roles_generic/strategy/multi/many_roles_spec.rb",
|
98
|
+
"spec/roles_generic/strategy/multi/role_strings_spec.rb",
|
99
|
+
"spec/roles_generic/strategy/multi/roles_mask_spec.rb",
|
100
|
+
"spec/roles_generic/strategy/multi/roles_string_spec.rb",
|
101
|
+
"spec/roles_generic/strategy/single/admin_flag_spec.rb",
|
102
|
+
"spec/roles_generic/strategy/single/one_role_spec.rb",
|
103
|
+
"spec/roles_generic/strategy/single/role_string_spec.rb",
|
104
|
+
"spec/spec_helper.rb"
|
105
105
|
]
|
106
106
|
|
107
107
|
if s.respond_to? :specification_version then
|
@@ -109,29 +109,29 @@ Gem::Specification.new do |s|
|
|
109
109
|
s.specification_version = 3
|
110
110
|
|
111
111
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
112
|
-
s.add_development_dependency(%q<rspec>, [">= 2.0.
|
113
|
-
s.add_development_dependency(%q<generator-spec>, [">= 0.7"])
|
112
|
+
s.add_development_dependency(%q<rspec>, [">= 2.0.1"])
|
113
|
+
s.add_development_dependency(%q<generator-spec>, [">= 0.7.2"])
|
114
114
|
s.add_runtime_dependency(%q<require_all>, ["~> 1.2.0"])
|
115
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 3.0"])
|
116
|
-
s.add_runtime_dependency(%q<sugar-high>, ["~> 0.3.
|
117
|
-
s.add_runtime_dependency(%q<rails3_artifactor>, ["~> 0.3.
|
115
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.1"])
|
116
|
+
s.add_runtime_dependency(%q<sugar-high>, ["~> 0.3.1"])
|
117
|
+
s.add_runtime_dependency(%q<rails3_artifactor>, ["~> 0.3.2"])
|
118
118
|
s.add_runtime_dependency(%q<logging_assist>, [">= 0.1.6"])
|
119
119
|
else
|
120
|
-
s.add_dependency(%q<rspec>, [">= 2.0.
|
121
|
-
s.add_dependency(%q<generator-spec>, [">= 0.7"])
|
120
|
+
s.add_dependency(%q<rspec>, [">= 2.0.1"])
|
121
|
+
s.add_dependency(%q<generator-spec>, [">= 0.7.2"])
|
122
122
|
s.add_dependency(%q<require_all>, ["~> 1.2.0"])
|
123
|
-
s.add_dependency(%q<activesupport>, [">= 3.0"])
|
124
|
-
s.add_dependency(%q<sugar-high>, ["~> 0.3.
|
125
|
-
s.add_dependency(%q<rails3_artifactor>, ["~> 0.3.
|
123
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.1"])
|
124
|
+
s.add_dependency(%q<sugar-high>, ["~> 0.3.1"])
|
125
|
+
s.add_dependency(%q<rails3_artifactor>, ["~> 0.3.2"])
|
126
126
|
s.add_dependency(%q<logging_assist>, [">= 0.1.6"])
|
127
127
|
end
|
128
128
|
else
|
129
|
-
s.add_dependency(%q<rspec>, [">= 2.0.
|
130
|
-
s.add_dependency(%q<generator-spec>, [">= 0.7"])
|
129
|
+
s.add_dependency(%q<rspec>, [">= 2.0.1"])
|
130
|
+
s.add_dependency(%q<generator-spec>, [">= 0.7.2"])
|
131
131
|
s.add_dependency(%q<require_all>, ["~> 1.2.0"])
|
132
|
-
s.add_dependency(%q<activesupport>, [">= 3.0"])
|
133
|
-
s.add_dependency(%q<sugar-high>, ["~> 0.3.
|
134
|
-
s.add_dependency(%q<rails3_artifactor>, ["~> 0.3.
|
132
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.1"])
|
133
|
+
s.add_dependency(%q<sugar-high>, ["~> 0.3.1"])
|
134
|
+
s.add_dependency(%q<rails3_artifactor>, ["~> 0.3.2"])
|
135
135
|
s.add_dependency(%q<logging_assist>, [">= 0.1.6"])
|
136
136
|
end
|
137
137
|
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :many_roles
|
3
2
|
|
4
3
|
class User
|
5
4
|
include Roles::Generic
|
6
|
-
strategy :many_roles, :default
|
7
5
|
|
8
|
-
role_class :role
|
9
6
|
attr_accessor :name
|
10
7
|
|
8
|
+
strategy :many_roles
|
11
9
|
valid_roles_are :admin, :user, :guest
|
12
10
|
|
13
11
|
def initialize name, *new_roles
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :role_strings
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
4
|
|
7
5
|
attr_accessor :name
|
8
6
|
|
9
|
-
strategy :role_strings
|
7
|
+
strategy :role_strings
|
10
8
|
valid_roles_are :admin, :user, :guest
|
11
9
|
|
12
10
|
def initialize name, *new_roles
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :roles_mask
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
4
|
|
7
5
|
attr_accessor :name
|
8
6
|
|
9
|
-
strategy :roles_mask
|
7
|
+
strategy :roles_mask
|
10
8
|
valid_roles_are :admin, :user, :guest
|
11
9
|
|
12
10
|
def initialize name, *new_roles
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :roles_string
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
4
|
|
7
5
|
attr_accessor :name
|
8
6
|
|
9
|
-
strategy :roles_string
|
7
|
+
strategy :roles_string
|
10
8
|
valid_roles_are :admin, :user, :guest
|
11
9
|
|
12
10
|
def initialize name, *new_roles
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :admin_flag
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
4
|
|
7
5
|
attr_accessor :name
|
8
6
|
|
9
|
-
strategy :admin_flag
|
7
|
+
strategy :admin_flag
|
10
8
|
valid_roles_are :admin, :user, :guest
|
11
9
|
|
12
10
|
def initialize name, *new_roles
|
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :one_role
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
|
-
strategy :one_role, :default
|
7
4
|
|
8
|
-
role_class :role
|
9
5
|
attr_accessor :name
|
10
6
|
|
7
|
+
strategy :one_role
|
11
8
|
valid_roles_are :admin, :user, :guest
|
12
9
|
|
13
10
|
def initialize name, *new_roles
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
use_roles_strategy :role_string
|
3
|
-
|
4
2
|
class User
|
5
3
|
include Roles::Generic
|
6
4
|
|
7
5
|
attr_accessor :name
|
8
6
|
|
9
|
-
strategy :role_string
|
7
|
+
strategy :role_string
|
10
8
|
valid_roles_are :admin, :user, :guest
|
11
9
|
|
12
10
|
def initialize name, *new_roles
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 4
|
9
|
+
version: 0.3.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Kristian Mandrup
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-12-26 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -28,8 +28,8 @@ dependencies:
|
|
28
28
|
segments:
|
29
29
|
- 2
|
30
30
|
- 0
|
31
|
-
-
|
32
|
-
version: 2.0.
|
31
|
+
- 1
|
32
|
+
version: 2.0.1
|
33
33
|
type: :development
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
@@ -43,7 +43,8 @@ dependencies:
|
|
43
43
|
segments:
|
44
44
|
- 0
|
45
45
|
- 7
|
46
|
-
|
46
|
+
- 2
|
47
|
+
version: 0.7.2
|
47
48
|
type: :development
|
48
49
|
version_requirements: *id002
|
49
50
|
- !ruby/object:Gem::Dependency
|
@@ -72,7 +73,8 @@ dependencies:
|
|
72
73
|
segments:
|
73
74
|
- 3
|
74
75
|
- 0
|
75
|
-
|
76
|
+
- 1
|
77
|
+
version: 3.0.1
|
76
78
|
type: :runtime
|
77
79
|
version_requirements: *id004
|
78
80
|
- !ruby/object:Gem::Dependency
|
@@ -86,8 +88,8 @@ dependencies:
|
|
86
88
|
segments:
|
87
89
|
- 0
|
88
90
|
- 3
|
89
|
-
-
|
90
|
-
version: 0.3.
|
91
|
+
- 1
|
92
|
+
version: 0.3.1
|
91
93
|
type: :runtime
|
92
94
|
version_requirements: *id005
|
93
95
|
- !ruby/object:Gem::Dependency
|
@@ -101,8 +103,8 @@ dependencies:
|
|
101
103
|
segments:
|
102
104
|
- 0
|
103
105
|
- 3
|
104
|
-
-
|
105
|
-
version: 0.3.
|
106
|
+
- 2
|
107
|
+
version: 0.3.2
|
106
108
|
type: :runtime
|
107
109
|
version_requirements: *id006
|
108
110
|
- !ruby/object:Gem::Dependency
|
@@ -128,13 +130,12 @@ extensions: []
|
|
128
130
|
|
129
131
|
extra_rdoc_files:
|
130
132
|
- LICENSE
|
131
|
-
- README.
|
133
|
+
- README.textile
|
132
134
|
files:
|
133
135
|
- .document
|
134
|
-
- .gitignore
|
135
136
|
- .rspec
|
136
137
|
- LICENSE
|
137
|
-
- README.
|
138
|
+
- README.textile
|
138
139
|
- Rakefile
|
139
140
|
- VERSION
|
140
141
|
- lib/generators/roles_generic/roles/roles_generator.rb
|
@@ -161,11 +162,13 @@ files:
|
|
161
162
|
- lib/roles_generic/rspec/test_it.rb
|
162
163
|
- lib/roles_generic/rspec/user_setup.rb
|
163
164
|
- lib/roles_generic/strategy.rb
|
165
|
+
- lib/roles_generic/strategy/multi/embed_many_roles.rb
|
164
166
|
- lib/roles_generic/strategy/multi/many_roles.rb
|
165
167
|
- lib/roles_generic/strategy/multi/role_strings.rb
|
166
168
|
- lib/roles_generic/strategy/multi/roles_mask.rb
|
167
169
|
- lib/roles_generic/strategy/multi/roles_string.rb
|
168
170
|
- lib/roles_generic/strategy/single/admin_flag.rb
|
171
|
+
- lib/roles_generic/strategy/single/embed_one_role.rb
|
169
172
|
- lib/roles_generic/strategy/single/one_role.rb
|
170
173
|
- lib/roles_generic/strategy/single/role_string.rb
|
171
174
|
- roles_generic.gemspec
|
@@ -193,12 +196,12 @@ files:
|
|
193
196
|
- wiki/strategies/roles_mask.textile
|
194
197
|
- wiki/strategies/roles_string.textile
|
195
198
|
has_rdoc: true
|
196
|
-
homepage: http://github.com/kristianmandrup/
|
199
|
+
homepage: http://github.com/kristianmandrup/roles_generic
|
197
200
|
licenses: []
|
198
201
|
|
199
202
|
post_install_message:
|
200
|
-
rdoc_options:
|
201
|
-
|
203
|
+
rdoc_options: []
|
204
|
+
|
202
205
|
require_paths:
|
203
206
|
- lib
|
204
207
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/.gitignore
DELETED
data/README.markdown
DELETED
@@ -1,178 +0,0 @@
|
|
1
|
-
# Generic Roles
|
2
|
-
|
3
|
-
Generic Roles is a common (generic) Roles API and implementation that specific Roles implementations for various ORMs can implement.
|
4
|
-
This library also comes with a Rails 3 generator that can configure an existing user model with a Role strategy of choice.
|
5
|
-
A similar generator should always be created for specific ORM implementations
|
6
|
-
|
7
|
-
I have developed the following *roles* gems for popular Object Mappers that all support the same Roles Generic API.
|
8
|
-
|
9
|
-
Relational Database (SQL)
|
10
|
-
* Active Record - [roles_active_record](http://github.com/kristianmandrup/roles_active_record)
|
11
|
-
* Data Mapper - [roles_data_mapper](http://github.com/kristianmandrup/roles_data_mapper)
|
12
|
-
|
13
|
-
Mongo DB
|
14
|
-
* Mongoid - [roles_mongoid](http://github.com/kristianmandrup/roles_mongoid)
|
15
|
-
* Mongo Mapper - [roles_mongo_mapper](http://github.com/kristianmandrup/roles_mongo_mapper)
|
16
|
-
|
17
|
-
Couch DB
|
18
|
-
* Simply Stored - [roles_simply_stored](http://github.com/kristianmandrup/roles_simply_stored)
|
19
|
-
|
20
|
-
Note: Feel free to roll your own ORM extension for your favorite Object Mapper!
|
21
|
-
|
22
|
-
## Install
|
23
|
-
|
24
|
-
<code>gem install roles_generic</code>
|
25
|
-
|
26
|
-
## Roles generator
|
27
|
-
|
28
|
-
A Rails 3 generator is included to update an existing model with a roles strategy and a set of valid roles
|
29
|
-
|
30
|
-
### Usage example
|
31
|
-
|
32
|
-
<code>rails g roles_generic:roles --strategy admin_flag --roles guest admin</code>
|
33
|
-
|
34
|
-
This generator is currently (Oct. 10) experimental. Feel free to provide patches or bug reports ;)
|
35
|
-
|
36
|
-
## Usage
|
37
|
-
|
38
|
-
The library comes with the following role models built-in:
|
39
|
-
|
40
|
-
Inline roles (in User model):
|
41
|
-
* admin_flag (Boolean flag - 'admin' or not)
|
42
|
-
* role_string (String)
|
43
|
-
* roles_string (Comma separated String - note: no role name must have a comma in its name!)
|
44
|
-
* role_strings (Set of Strings)
|
45
|
-
* roles_mask (Integer mask)
|
46
|
-
|
47
|
-
Using separate Role model:
|
48
|
-
* one_role (relation to a Role model instance)
|
49
|
-
* many_roles(Set of Role relationships)
|
50
|
-
|
51
|
-
Note: The following examples use RSpec to demonstrate usage scenarios.
|
52
|
-
|
53
|
-
Examples of configuring for the other strategies can be found on the wiki pages.
|
54
|
-
|
55
|
-
## Example : admin_flag
|
56
|
-
|
57
|
-
Creates and uses a binary field 'admin_flag', which when true signals that this user is an administrator and otherwise a normal user.
|
58
|
-
|
59
|
-
<pre>
|
60
|
-
class User
|
61
|
-
include Roles::Generic
|
62
|
-
|
63
|
-
attr_accessor :name, :admin_flag
|
64
|
-
|
65
|
-
role_strategy :admin_flag, :default
|
66
|
-
|
67
|
-
roles :admin, :user
|
68
|
-
|
69
|
-
def initialize name, *new_roles
|
70
|
-
self.name = name
|
71
|
-
self.roles = new_roles
|
72
|
-
end
|
73
|
-
end
|
74
|
-
</pre>
|
75
|
-
|
76
|
-
## Example: Using an Object Mapper
|
77
|
-
|
78
|
-
Data Mapper with persistent attributes :name and :admin_flag
|
79
|
-
|
80
|
-
<pre>
|
81
|
-
class User
|
82
|
-
include Roles::Generic
|
83
|
-
include DataMapper::Resource
|
84
|
-
|
85
|
-
property :name, Boolean
|
86
|
-
property :admin_flag, Boolean
|
87
|
-
|
88
|
-
role_strategy :admin_flag, :default
|
89
|
-
|
90
|
-
roles :admin, :user
|
91
|
-
|
92
|
-
def initialize name, *new_roles
|
93
|
-
self.name = name
|
94
|
-
self.roles = new_roles
|
95
|
-
end
|
96
|
-
end
|
97
|
-
</pre>
|
98
|
-
|
99
|
-
_Note:_ I recommend using s specific ORM roles gem such as *roles_data_mapper* instead. But this approach might be a good starting point for developing a *roles* gem for an ORM that is not supported ;)
|
100
|
-
|
101
|
-
## Role API
|
102
|
-
|
103
|
-
### Instance methods
|
104
|
-
|
105
|
-
Has ALL of the given roles been assigned?
|
106
|
-
* has_roles?(*roles) - alias: is?
|
107
|
-
|
108
|
-
Has ANY (at least ONE) of the given roles been assigned?
|
109
|
-
* has_role? *roles - alias: has?
|
110
|
-
|
111
|
-
Is this a valid role? (can the role be found in list of valid roles?)
|
112
|
-
* valid_role? role
|
113
|
-
|
114
|
-
Is this user the admin user (and user has no other roles)
|
115
|
-
* admin? - short for - is?(:admin)
|
116
|
-
|
117
|
-
### Class methods
|
118
|
-
|
119
|
-
* roles - list of valid roles
|
120
|
-
* roles_attribute - get the attribute where the role is stored on the user
|
121
|
-
* roles_attribute= - set the role(s) attribute
|
122
|
-
|
123
|
-
## Usage of API
|
124
|
-
|
125
|
-
<pre>
|
126
|
-
before :each do
|
127
|
-
@admin_user = User.new 'Admin user', :admin
|
128
|
-
@guest = User.new 'Guest', :guest
|
129
|
-
end
|
130
|
-
|
131
|
-
it "user 'Admin user' should have role :admin" do
|
132
|
-
|
133
|
-
@admin_user.role.should == :admin
|
134
|
-
@admin_user.roles.should == [:admin]
|
135
|
-
@admin_user.admin?.should be_true
|
136
|
-
|
137
|
-
@admin_user.has_role? (:user).should be_false
|
138
|
-
|
139
|
-
@admin_user.has_role? (:admin).should be_true
|
140
|
-
@admin_user.is? (:admin).should be_true
|
141
|
-
@admin_user.has_roles? (:admin).should be_true
|
142
|
-
@admin_user.has? (:admin).should be_true
|
143
|
-
|
144
|
-
end
|
145
|
-
|
146
|
-
it "user Guest should have role :guest" do
|
147
|
-
@guest.roles.should == [:guest]
|
148
|
-
@guest.admin?.should be_false
|
149
|
-
|
150
|
-
@guest.has_role? (:guest).should be_true
|
151
|
-
@guest.has_role? (:admin).should be_false
|
152
|
-
@guest.is? (:admin).should be_false
|
153
|
-
|
154
|
-
@guest.has_roles? (:guest).should be_true
|
155
|
-
@guest.has? (:admin).should be_false
|
156
|
-
end
|
157
|
-
|
158
|
-
it "should set role of Guest user from :guest to :admin using roles=" do
|
159
|
-
@guest.roles = :admin
|
160
|
-
@guest.role.should == :admin
|
161
|
-
|
162
|
-
@guest.has_role?(:admin).should be_true
|
163
|
-
end
|
164
|
-
</pre>
|
165
|
-
|
166
|
-
## Note on Patches/Pull Requests
|
167
|
-
|
168
|
-
* Fork the project.
|
169
|
-
* Make your feature addition or bug fix.
|
170
|
-
* Add tests for it. This is important so I don't break it in a
|
171
|
-
future version unintentionally.
|
172
|
-
* Commit, do not mess with rakefile, version, or history.
|
173
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
174
|
-
* Send me a pull request. Bonus points for topic branches.
|
175
|
-
|
176
|
-
## Copyright
|
177
|
-
|
178
|
-
Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.
|