roles_for_mongoid 0.1.1 → 0.2.0
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.
- 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
|