roles_for_mongoid 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/README.markdown +14 -109
- data/Rakefile +5 -1
- data/VERSION +1 -1
- data/lib/generators/mongoid/roles/roles_generator.rb +48 -25
- data/lib/roles_mongoid.rb +9 -0
- data/lib/roles_mongoid/base.rb +35 -0
- data/lib/roles_mongoid/namespaces.rb +12 -0
- data/lib/roles_mongoid/role.rb +28 -0
- data/lib/roles_mongoid/strategy.rb +15 -0
- data/lib/roles_mongoid/strategy/multi/many_roles.rb +65 -0
- data/lib/roles_mongoid/strategy/multi/role_strings.rb +63 -0
- data/lib/roles_mongoid/strategy/multi/roles_mask.rb +81 -0
- data/lib/roles_mongoid/strategy/single/admin_flag.rb +53 -0
- data/lib/roles_mongoid/strategy/single/one_role.rb +56 -0
- data/lib/roles_mongoid/strategy/single/role_string.rb +51 -0
- data/roles_for_mongoid.gemspec +43 -24
- data/sandbox/roles_assign.rb +54 -0
- data/sandbox/single_role.rb +68 -0
- data/spec/roles_mongoid/admin_flag_spec.rb +74 -0
- data/spec/roles_mongoid/many_roles_spec.rb +74 -0
- data/spec/roles_mongoid/one_role_spec.rb +74 -0
- data/spec/roles_mongoid/role_string_spec.rb +73 -0
- data/spec/roles_mongoid/role_strings_spec.rb +73 -0
- data/spec/roles_mongoid/roles_mask_spec.rb +73 -0
- data/spec/spec_helper.rb +17 -7
- metadata +94 -25
- data/lib/roles_for_mongoid.rb +0 -1
- data/lib/roles_for_mongoid/role.rb +0 -4
- data/lib/roles_for_mongoid/strategies/admin_flag.rb +0 -17
- data/lib/roles_for_mongoid/strategies/inline_role.rb +0 -6
- data/lib/roles_for_mongoid/strategies/inline_roles.rb +0 -13
- data/lib/roles_for_mongoid/strategies/role_relations.rb +0 -34
- data/lib/roles_for_mongoid/strategies/roles_mask.rb +0 -52
- data/lib/roles_for_mongoid/user.rb +0 -12
- data/spec/roles_for_mongoid/user_admin_field_spec.rb +0 -24
- data/spec/roles_for_mongoid/user_inline_role_spec.rb +0 -23
- data/spec/roles_for_mongoid/user_inline_roles_spec.rb +0 -27
- data/spec/roles_for_mongoid/user_role_relations_spec.rb +0 -37
- data/spec/roles_for_mongoid/user_roles_mask_spec.rb +0 -29
- data/spec/spec.opts +0 -1
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format nested --color
|
data/README.markdown
CHANGED
@@ -1,125 +1,30 @@
|
|
1
1
|
# Roles for Mongoid
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
<code>gem install roles_for_mongoid</code>
|
6
|
-
|
7
|
-
# Usage
|
8
|
-
|
9
|
-
The library comes with the following role models built-in:
|
10
|
-
|
11
|
-
* Single inline role (string)
|
12
|
-
* Multiple inline role (strings)
|
13
|
-
* Multiple role relations (many relationship using array of object ids)
|
14
|
-
|
15
|
-
Note: The following examples use RSpec to demonstrate usage scenarios.
|
16
|
-
|
17
|
-
## Example : Admin flag
|
18
|
-
|
19
|
-
<pre>
|
20
|
-
require 'roles_for_mongoid'
|
21
|
-
|
22
|
-
User.role_strategy :admin_flag
|
23
|
-
|
24
|
-
before :each do
|
25
|
-
guest_user = User.new :name => 'Kristian', :role => 'guest'
|
26
|
-
admin_user = User.new :name => 'Admin user', :role => 'admin'
|
27
|
-
admin_user.save
|
28
|
-
guest_user.save
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should return first user maching role" do
|
32
|
-
User.in_role('guest').first.name.should == 'Kristian'
|
33
|
-
User.in_role('admin').first.name.should == 'Admin user'
|
34
|
-
end
|
35
|
-
</pre>
|
36
|
-
|
37
|
-
|
38
|
-
## Example : Single inline role
|
39
|
-
|
40
|
-
<pre>
|
41
|
-
User.role_strategy :inline_role
|
3
|
+
A Mongoid implementation of [roles generic](http://github.com/kristianmandrup/roles_generic)
|
42
4
|
|
43
|
-
|
44
|
-
guest_user = User.new :name => 'Kristian', :role => 'guest'
|
45
|
-
admin_user = User.new :name => 'Admin user', :role => 'admin'
|
46
|
-
admin_user.save
|
47
|
-
guest_user.save
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should return first user maching role" do
|
51
|
-
User.in_role('guest').first.name.should == 'Kristian'
|
52
|
-
User.in_role('admin').first.name.should == 'Admin user'
|
53
|
-
end
|
54
|
-
</pre>
|
55
|
-
|
56
|
-
## Example : Multiple inline roles
|
57
|
-
|
58
|
-
<pre>
|
59
|
-
User.role_strategy :inline_roles
|
60
|
-
|
61
|
-
before :each do
|
62
|
-
guest_user = User.new(:name => 'Kristian', :roles => ['guest']).save
|
63
|
-
admin_user = User.new(:name => 'Admin user', :roles => ['admin']).save
|
64
|
-
author_user = User.new(:name => 'Author', :roles => ['author']).save
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should return first user matching role" do
|
68
|
-
User.in_role('admin').first.name.should == 'Admin user'
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should return all users matching any of the roles" do
|
72
|
-
User.in_roles(['guest', 'admin']).all.size.should == 2
|
73
|
-
User.in_roles('guest', 'admin').all.size.should == 2
|
74
|
-
end
|
75
|
-
</pre>
|
76
|
-
|
77
|
-
## Example : Multiple role relations
|
78
|
-
|
79
|
-
<pre>
|
80
|
-
User.role_strategy :role_relations
|
81
|
-
|
82
|
-
before :each do
|
83
|
-
guest_user = User.new(:name => 'Kristian')
|
84
|
-
admin_user = User.new(:name => 'Admin user')
|
85
|
-
author_user = User.new(:name => 'Author')
|
5
|
+
# Install
|
86
6
|
|
87
|
-
|
88
|
-
guest_user.save
|
7
|
+
<code>gem install roles_mongoid</code>
|
89
8
|
|
90
|
-
|
91
|
-
admin_user.save
|
92
|
-
|
93
|
-
author_user.roles << Role.new(:name => 'author')
|
94
|
-
author_user.save
|
95
|
-
end
|
9
|
+
## Status: Sept 6, 2010
|
96
10
|
|
97
|
-
|
98
|
-
|
99
|
-
User.in_role('admin').first.name.should == 'Admin user'
|
100
|
-
end
|
11
|
+
Implements the [roles generic](http://github.com/kristianmandrup/roles_generic) Roles API
|
12
|
+
It also implements the following Role strategies:
|
101
13
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
14
|
+
* admin_flag
|
15
|
+
* many_roles
|
16
|
+
* one_role
|
17
|
+
* roles_mask
|
18
|
+
* role_string
|
19
|
+
* role_strings
|
107
20
|
|
108
21
|
## Rails generator
|
109
22
|
|
110
|
-
|
111
|
-
The following role strategies are included by default. Add your own by adding extra files inside the strategy folder, one file for each role strategy is recommended.
|
112
|
-
|
113
|
-
* admin_flag
|
114
|
-
* inline_role
|
115
|
-
* inline_roles
|
116
|
-
* role_relations
|
117
|
-
* role_mask
|
23
|
+
Might work but needs testing ;)
|
118
24
|
|
119
25
|
Example:
|
120
26
|
|
121
|
-
<code>$ rails g mongoid:roles
|
122
|
-
|
27
|
+
<code>$ rails g mongoid:roles User --strategy admin_flag --roles admin guest</code>
|
123
28
|
|
124
29
|
## Note on Patches/Pull Requests
|
125
30
|
|
data/Rakefile
CHANGED
@@ -7,7 +7,11 @@ begin
|
|
7
7
|
gem.email = "kmandrup@gmail.com"
|
8
8
|
gem.homepage = "http://github.com/kristianmandrup/roles_for_mm"
|
9
9
|
gem.authors = ["Kristian Mandrup"]
|
10
|
-
gem.add_development_dependency "rspec", ">= 2.0.0.beta.
|
10
|
+
gem.add_development_dependency "rspec", ">= 2.0.0.beta.19"
|
11
|
+
gem.add_dependency "mongoid", '~> 2.0.0.beta.17'
|
12
|
+
gem.add_dependency "require_all", '~> 1.1.0'
|
13
|
+
gem.add_dependency "sugar-high", '~> 0.2.3'
|
14
|
+
gem.add_dependency "roles_generic", '~> 0.2.2'
|
11
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
12
16
|
end
|
13
17
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -1,45 +1,68 @@
|
|
1
|
-
|
1
|
+
require 'rails3_artifactor'
|
2
|
+
|
3
|
+
module RolesModel
|
2
4
|
module Generators
|
3
5
|
class RolesGenerator < Rails::Generators::NamedBase
|
4
|
-
|
6
|
+
include Rails3::Assist::Artifact::Model
|
7
|
+
|
8
|
+
desc "Add role strategy to a model"
|
5
9
|
|
6
|
-
|
10
|
+
class_option :strategy, :type => :string, :aliases => "-s", :default => 'role_string',
|
11
|
+
:desc => "Role strategy to use (admin_flag, role_string, roles_string, role_strings, one_role, many_roles, roles_mask)"
|
12
|
+
|
13
|
+
|
14
|
+
class_option :roles, :type => :array, :aliases => "-r", :default => [], :desc => "Valid roles"
|
7
15
|
|
8
|
-
hook_for :orm
|
16
|
+
# hook_for :orm
|
9
17
|
|
10
|
-
def
|
11
|
-
|
18
|
+
# def self.source_root
|
19
|
+
# @source_root ||= File.expand_path("../../templates", __FILE__)
|
20
|
+
# end
|
21
|
+
|
22
|
+
def apply_role_strategy
|
23
|
+
self.class.use_orm orm if orm
|
24
|
+
insert_into_model name do
|
25
|
+
insertion_text
|
26
|
+
end
|
12
27
|
end
|
13
28
|
|
14
29
|
protected
|
15
30
|
|
16
|
-
def
|
17
|
-
|
31
|
+
def orm
|
32
|
+
:mongoid
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_roles
|
36
|
+
[:admin, :guest]
|
18
37
|
end
|
19
38
|
|
20
|
-
def
|
21
|
-
|
39
|
+
def roles_to_add
|
40
|
+
default_roles.concat(options[:roles]).compact.uniq
|
41
|
+
end
|
42
|
+
|
43
|
+
def roles
|
44
|
+
@roles ||= roles_to_add.map{|r| ":#{r}" }
|
22
45
|
end
|
23
46
|
|
24
47
|
def role_strategy_statement
|
25
|
-
"
|
48
|
+
"strategy :#{strategy}\n"
|
26
49
|
end
|
27
50
|
|
28
|
-
def
|
29
|
-
|
51
|
+
def roles_statement
|
52
|
+
roles ? "valid_roles #{roles.join(',')}" : ''
|
53
|
+
end
|
54
|
+
|
55
|
+
def insertion_text
|
56
|
+
%Q{
|
57
|
+
include Roles::#{orm.to_s.camelize}
|
58
|
+
#{role_strategy_statement}
|
59
|
+
#{roles_statement}
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def strategy
|
64
|
+
options[:strategy]
|
30
65
|
end
|
31
|
-
|
32
|
-
def model_file(name)
|
33
|
-
File.join(Rails.root, "app/models/#{name.to_s}.rb")
|
34
|
-
end
|
35
|
-
|
36
|
-
def insert_into_model(m_name, insert_text)
|
37
|
-
file = File.new(model_file(m_name))
|
38
|
-
return if (file.read =~ /#{insert_text}/)
|
39
|
-
gsub_file model_file(m_name), match_expr do |match|
|
40
|
-
match << insert_text
|
41
|
-
end
|
42
|
-
end
|
43
66
|
end
|
44
67
|
end
|
45
68
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Roles::Base
|
2
|
+
def valid_roles_are(*role_list)
|
3
|
+
strategy_class.valid_roles = role_list.to_symbols
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
module Roles
|
8
|
+
module Mongoid
|
9
|
+
def self.included(base)
|
10
|
+
base.extend Roles::Base
|
11
|
+
base.extend ClassMethods
|
12
|
+
base.orm_name = :mongoid
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
MAP = {
|
18
|
+
:admin_flag => "field :admin_flag, :type => Boolean",
|
19
|
+
:many_roles => "references_many :many_roles, :stored_as => :array, :class_name => 'Role', :default => []",
|
20
|
+
:one_role => "references_one :one_role, :class_name => 'Role'",
|
21
|
+
:roles_mask => "field :roles_mask, :type => Integer, :default => 1",
|
22
|
+
:role_string => "field :role_string, :type => String",
|
23
|
+
:role_strings => "field :role_strings, :type => Array",
|
24
|
+
:roles_string => "field :roles_string, :type => String"
|
25
|
+
}
|
26
|
+
|
27
|
+
def strategy name, options=nil
|
28
|
+
if options == :default && MAP[name]
|
29
|
+
instance_eval MAP[name]
|
30
|
+
end
|
31
|
+
role_strategy name, options
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Roles::Base
|
2
|
+
def valid_roles_are(*role_list)
|
3
|
+
strategy_class.valid_roles = role_list.to_symbols
|
4
|
+
if role_class_name
|
5
|
+
role_list.each do |name|
|
6
|
+
role_class_name.create(:name => name.to_s)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Role
|
13
|
+
include Mongoid::Document
|
14
|
+
field :name, :type => String
|
15
|
+
referenced_in :user
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def find_roles(*role_names)
|
19
|
+
where(:name.in => role_names.flatten).to_a
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_role role_name
|
23
|
+
raise ArgumentError, "#find_role takes a single role name as argument, not: #{role_name.inspect}" if !role_name.kind_of_label?
|
24
|
+
res = find_roles(role_name)
|
25
|
+
res ? res.first : res
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module RoleStrategy::Mongoid
|
2
|
+
module ManyRoles
|
3
|
+
def self.default_role_attribute
|
4
|
+
:many_roles
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.included base
|
8
|
+
base.extend Roles::Generic::Role::ClassMethods
|
9
|
+
base.extend ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def role_attribute
|
14
|
+
"#{strategy_class.roles_attribute_name.to_s.singularize}_ids".to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
def in_role(role_name)
|
18
|
+
in_roles(role_name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def in_roles(*role_names)
|
22
|
+
begin
|
23
|
+
role_ids = Role.where(:name.in => role_names.to_strings).to_a.map(&:_id)
|
24
|
+
criteria.in(role_attribute => role_ids).to_a
|
25
|
+
rescue
|
26
|
+
return []
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module Implementation
|
32
|
+
def role_attribute
|
33
|
+
strategy_class.roles_attribute_name
|
34
|
+
end
|
35
|
+
|
36
|
+
# assign roles
|
37
|
+
def roles=(*roles)
|
38
|
+
raise "Role class #{role_class} does not have a #find_role(role) method" if !role_class.respond_to? :find_role
|
39
|
+
role_relations = role_class.find_roles(*roles)
|
40
|
+
self.send("#{role_attribute}=", role_relations)
|
41
|
+
save
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_roles(*roles)
|
45
|
+
raise "Role class #{role_class} does not have a #find_role(role) method" if !role_class.respond_to? :find_role
|
46
|
+
role_relations = role_class.find_roles(*roles)
|
47
|
+
self.many_roles << role_relations
|
48
|
+
save
|
49
|
+
end
|
50
|
+
|
51
|
+
# query assigned roles
|
52
|
+
def roles
|
53
|
+
self.send(role_attribute)
|
54
|
+
end
|
55
|
+
|
56
|
+
def roles_list
|
57
|
+
[roles].flatten.map{|r| r.name }.compact.to_symbols
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
extend Roles::Generic::User::Configuration
|
62
|
+
configure :type => :role_class
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module RoleStrategy::Mongoid
|
2
|
+
module RoleStrings
|
3
|
+
def self.default_role_attribute
|
4
|
+
:role_strings
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.included base
|
8
|
+
base.extend ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def role_attribute
|
13
|
+
strategy_class.roles_attribute_name.to_sym
|
14
|
+
end
|
15
|
+
|
16
|
+
def in_role(role_name)
|
17
|
+
in_roles(role_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def in_roles(*role_names)
|
21
|
+
begin
|
22
|
+
where(role_attribute.in => role_names).to_a
|
23
|
+
rescue
|
24
|
+
return []
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Implementation
|
30
|
+
def role_attribute
|
31
|
+
strategy_class.roles_attribute_name
|
32
|
+
end
|
33
|
+
|
34
|
+
# assign roles
|
35
|
+
def roles=(*new_roles)
|
36
|
+
new_roles = new_roles.flatten.map{|r| r.to_s if valid_role?(r)}.compact
|
37
|
+
if new_roles && new_roles.not.empty?
|
38
|
+
self.send("#{role_attribute}=", new_roles.compact.uniq)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
alias_method :role=, :roles=
|
42
|
+
|
43
|
+
def add_roles(*roles_to_add)
|
44
|
+
roles_to_add = roles_to_add.flatten.map{|r| r.to_s if valid_role?(r)}.compact
|
45
|
+
if new_roles && new_roles.not.empty?
|
46
|
+
self.send(role_attribute) << new_roles.compact.uniq
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# query assigned roles
|
51
|
+
def roles
|
52
|
+
self.send(role_attribute).map{|r| r.to_sym}
|
53
|
+
end
|
54
|
+
|
55
|
+
def roles_list
|
56
|
+
[roles].flatten
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
extend Roles::Generic::User::Configuration
|
61
|
+
configure
|
62
|
+
end
|
63
|
+
end
|