rolify 0.7.0 → 1.0.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/.travis.yml +3 -0
- data/CHANGELOG.rdoc +11 -0
- data/Gemfile +2 -1
- data/README.rdoc +1 -2
- data/Rakefile +7 -0
- data/lib/generators/rolify/role/role_generator.rb +2 -1
- data/lib/generators/rolify/role/templates/initializer.rb +1 -0
- data/lib/rolify.rb +0 -1
- data/lib/rolify/role.rb +30 -18
- data/lib/rolify/version.rb +1 -1
- data/spec/rolify/role_spec.rb +42 -12
- metadata +38 -44
- data/lib/rolify/rolify_railtie.rb +0 -9
data/.travis.yml
ADDED
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
= 1.0
|
2
|
+
* added a new parameter to disable dynamic shortcut methods due to potential incompatibility with other gems using method_missing with the same pattern
|
3
|
+
* add <tt>Rolify.dynamic_shortcuts = false</tt> in the initializer file or
|
4
|
+
* use the generator command with a third parameter:
|
5
|
+
* <tt>rails g rolify:role Role User false</tt>
|
6
|
+
* removed the railtie as it created more problems than it solved
|
7
|
+
* code refactoring to do some speed improvements and code clean up
|
8
|
+
* added a lot of specs to improve tests coverage
|
9
|
+
* wrote a tutorial showing how to use rolify with CanCan and Devise
|
10
|
+
* rolify is now on travis-ci
|
11
|
+
|
1
12
|
= 0.7
|
2
13
|
* 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)
|
3
14
|
* dynamic shortcut is created on the fly in the method_missing to avoid extra method_missing for the same dynamic shortcut
|
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -8,6 +8,7 @@ module Rolify
|
|
8
8
|
source_root File.expand_path('../templates', __FILE__)
|
9
9
|
argument :role_cname, :type => :string, :default => "Role"
|
10
10
|
argument :user_cname, :type => :string, :default => "User"
|
11
|
+
class_option :dynamic_shortcuts, :type => :boolean, :default => true
|
11
12
|
|
12
13
|
desc "Generates a model with the given NAME and a migration file."
|
13
14
|
|
@@ -15,7 +16,7 @@ module Rolify
|
|
15
16
|
template "role.rb", "app/models/#{role_cname.downcase}.rb"
|
16
17
|
inject_into_class(model_path, user_cname.camelize) do
|
17
18
|
" include Rolify::Roles\n" +
|
18
|
-
" extend Rolify::Reloaded\n" +
|
19
|
+
"#{" extend Rolify::Reloaded\n" if options[:dynamic_shortcuts]}" +
|
19
20
|
" has_and_belongs_to_many :roles#{", :class_name => \"" + role_cname.camelize + "\"" if role_cname != "Role"}, :join_table => :#{user_cname.tableize + "_" + role_cname.tableize}\n"
|
20
21
|
end
|
21
22
|
end
|
data/lib/rolify.rb
CHANGED
data/lib/rolify/role.rb
CHANGED
@@ -16,6 +16,14 @@ module Rolify
|
|
16
16
|
@@user_cname = user_cname
|
17
17
|
end
|
18
18
|
|
19
|
+
def self.dynamic_shortcuts
|
20
|
+
@@dynamic_shortcuts || false
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.dynamic_shortcuts=(is_dynamic)
|
24
|
+
@@dynamic_shortcuts = is_dynamic
|
25
|
+
Rolify.user_cname.load_dynamic_methods if is_dynamic
|
26
|
+
end
|
19
27
|
|
20
28
|
module Roles
|
21
29
|
|
@@ -24,7 +32,7 @@ module Rolify
|
|
24
32
|
:resource_type => (resource.class.name if resource),
|
25
33
|
:resource_id => (resource.id if resource))
|
26
34
|
if !roles.include?(role)
|
27
|
-
self.class.define_dynamic_method
|
35
|
+
self.class.define_dynamic_method(role_name, resource) if Rolify.dynamic_shortcuts
|
28
36
|
self.roles << role
|
29
37
|
end
|
30
38
|
end
|
@@ -35,8 +43,6 @@ module Rolify
|
|
35
43
|
end
|
36
44
|
|
37
45
|
def has_all_roles?(*args)
|
38
|
-
conditions = []
|
39
|
-
values = []
|
40
46
|
args.each do |arg|
|
41
47
|
if arg.is_a? Hash
|
42
48
|
return false if !self.has_role?(arg[:name], arg[:resource])
|
@@ -50,19 +56,7 @@ module Rolify
|
|
50
56
|
end
|
51
57
|
|
52
58
|
def has_any_role?(*args)
|
53
|
-
conditions =
|
54
|
-
values = []
|
55
|
-
args.each do |arg|
|
56
|
-
if arg.is_a? Hash
|
57
|
-
a, v = build_query(arg[:name], arg[:resource])
|
58
|
-
elsif arg.is_a? String
|
59
|
-
a, v = build_query(arg)
|
60
|
-
else
|
61
|
-
raise ArgumentError, "Invalid argument type: only hash or string allowed"
|
62
|
-
end
|
63
|
-
conditions << a
|
64
|
-
values += v
|
65
|
-
end
|
59
|
+
conditions, values = sql_conditions(args)
|
66
60
|
self.roles.where([ conditions.join(' OR '), *values ]).size > 0
|
67
61
|
end
|
68
62
|
|
@@ -82,13 +76,31 @@ module Rolify
|
|
82
76
|
if Rolify.role_cname.where(:name => $1).count > 0
|
83
77
|
resource = args.first
|
84
78
|
self.class.define_dynamic_method $1, resource
|
85
|
-
has_role?("#{$1}", resource)
|
79
|
+
return has_role?("#{$1}", resource)
|
86
80
|
end
|
87
|
-
end
|
81
|
+
end unless !Rolify.dynamic_shortcuts
|
82
|
+
super
|
88
83
|
end
|
89
84
|
|
90
85
|
private
|
91
86
|
|
87
|
+
def sql_conditions(args)
|
88
|
+
conditions = []
|
89
|
+
values = []
|
90
|
+
args.each do |arg|
|
91
|
+
if arg.is_a? Hash
|
92
|
+
a, v = build_query(arg[:name], arg[:resource])
|
93
|
+
elsif arg.is_a? String
|
94
|
+
a, v = build_query(arg)
|
95
|
+
else
|
96
|
+
raise ArgumentError, "Invalid argument type: only hash or string allowed"
|
97
|
+
end
|
98
|
+
conditions << a
|
99
|
+
values += v
|
100
|
+
end
|
101
|
+
[ conditions, values ]
|
102
|
+
end
|
103
|
+
|
92
104
|
def build_query(role, resource = nil)
|
93
105
|
query = "((name = ?) AND (resource_type IS NULL) AND (resource_id IS NULL))"
|
94
106
|
values = [ role ]
|
data/lib/rolify/version.rb
CHANGED
data/spec/rolify/role_spec.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
shared_examples_for "Rolify module" do
|
3
|
+
shared_examples_for "Rolify module" do |dynamic|
|
4
4
|
context "in a Instance level" do
|
5
5
|
before(:all) do
|
6
6
|
Rolify.user_cname = user_cname
|
7
7
|
Rolify.role_cname = role_cname
|
8
|
+
Rolify.dynamic_shortcuts = dynamic_shortcuts
|
9
|
+
Rolify.role_cname.destroy_all
|
8
10
|
@admin = Rolify.user_cname.first
|
9
11
|
@admin.has_role "admin"
|
10
12
|
@admin.has_role "moderator", Forum.first
|
@@ -35,23 +37,28 @@ shared_examples_for "Rolify module" do
|
|
35
37
|
@admin.should respond_to(:has_no_role).with(2).arguments
|
36
38
|
end
|
37
39
|
|
38
|
-
it "should respond to dynamic methods" do
|
40
|
+
it "should respond to dynamic methods", :if => dynamic do
|
39
41
|
@admin.should respond_to(:is_admin?).with(0).arguments
|
40
42
|
@admin.should respond_to(:is_moderator_of?).with(1).arguments
|
41
43
|
end
|
42
44
|
|
43
|
-
it "should not respond to any unknown methods" do
|
45
|
+
it "should not respond to any unknown methods", :if => dynamic do
|
44
46
|
@admin.should_not respond_to(:is_god?)
|
45
47
|
end
|
46
48
|
|
47
|
-
it "should create a new dynamic method if role exists in database" do
|
49
|
+
it "should create a new dynamic method if role exists in database", :if => dynamic do
|
48
50
|
Rolify.role_cname.create(:name => "superman")
|
49
|
-
@admin.is_superman?.should be(false)
|
50
51
|
@admin.should respond_to(:is_superman?).with(0).arguments
|
52
|
+
@admin.is_superman?.should be(false)
|
51
53
|
Rolify.role_cname.create(:name => "batman", :resource => Forum.first)
|
52
|
-
@admin.is_batman_of?(Forum.first).should be(false)
|
53
54
|
@admin.should respond_to(:is_batman_of?).with(1).arguments
|
54
55
|
@admin.should respond_to(:is_batman?).with(0).arguments
|
56
|
+
@admin.is_batman_of?(Forum.first).should be(false)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should not have any dynamic methods if dynamic_shortcuts is disabled", :if => dynamic == false do
|
60
|
+
@admin.should_not respond_to(:is_admin?)
|
61
|
+
@admin.should_not respond_to(:is_moderator_of?)
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
@@ -79,7 +86,7 @@ shared_examples_for "Rolify module" do
|
|
79
86
|
@admin.has_role?("admin").should be(true)
|
80
87
|
end
|
81
88
|
|
82
|
-
it "should be able to use dynamic shortcut" do
|
89
|
+
it "should be able to use dynamic shortcut", :if => dynamic do
|
83
90
|
@admin.is_admin?.should be(true)
|
84
91
|
end
|
85
92
|
|
@@ -102,13 +109,14 @@ shared_examples_for "Rolify module" do
|
|
102
109
|
end
|
103
110
|
|
104
111
|
it "should check if user has all of a global roles set" do
|
105
|
-
@admin.
|
112
|
+
@admin.has_all_roles?("staff").should be(true)
|
106
113
|
@admin.has_all_roles?("admin", "staff").should be(true)
|
107
114
|
@admin.has_all_roles?("admin", "dummy").should be(false)
|
108
115
|
@admin.has_all_roles?("dummy", "dumber").should be(false)
|
109
116
|
end
|
110
117
|
|
111
118
|
it "should check if user has any of a global roles set" do
|
119
|
+
@admin.has_any_role?("staff").should be(true)
|
112
120
|
@admin.has_any_role?("admin", "staff").should be(true)
|
113
121
|
@admin.has_any_role?("admin", "moderator").should be(true)
|
114
122
|
@admin.has_any_role?("dummy", "dumber").should be(false)
|
@@ -155,7 +163,7 @@ shared_examples_for "Rolify module" do
|
|
155
163
|
@moderator.has_role?("moderator", Forum.first).should be(true)
|
156
164
|
end
|
157
165
|
|
158
|
-
it "should be able to use dynamic shortcut" do
|
166
|
+
it "should be able to use dynamic shortcut", :if => dynamic do
|
159
167
|
@moderator.is_moderator?.should be(false)
|
160
168
|
@moderator.is_moderator_of?(Forum.first).should be(true)
|
161
169
|
@moderator.is_moderator_of?(Forum.last).should be(false)
|
@@ -181,6 +189,7 @@ shared_examples_for "Rolify module" do
|
|
181
189
|
end
|
182
190
|
|
183
191
|
it "should check if user has all of a scoped roles set" do
|
192
|
+
@moderator.has_all_roles?({ :name => "visitor", :resource => Forum.last }).should be(true)
|
184
193
|
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first },
|
185
194
|
{ :name => "visitor", :resource => Forum.last }).should be(true)
|
186
195
|
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first },
|
@@ -190,6 +199,7 @@ shared_examples_for "Rolify module" do
|
|
190
199
|
end
|
191
200
|
|
192
201
|
it "should check if user has any of a scoped roles set" do
|
202
|
+
@moderator.has_any_role?( { :name => "visitor", :resource => Forum.last }).should be(true)
|
193
203
|
@moderator.has_any_role?( { :name => "moderator", :resource => Forum.first },
|
194
204
|
{ :name => "visitor", :resource => Forum.last }).should be(true)
|
195
205
|
@moderator.has_any_role?( { :name => "moderator", :resource => Forum.first },
|
@@ -235,12 +245,14 @@ shared_examples_for "Rolify module" do
|
|
235
245
|
it "should check if user has all of a mix of global and scoped roles set" do
|
236
246
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.first }).should be(true)
|
237
247
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.last }).should be(false)
|
248
|
+
@user.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => Forum.first }).should be(true)
|
238
249
|
@user.has_all_roles?("dummy", { :name => "dumber", :resource => Forum.last }).should be(false)
|
239
250
|
end
|
240
251
|
|
241
252
|
it "should check if user has any of a mix of global and scoped roles set" do
|
242
253
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.first }).should be(true)
|
243
254
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.last }).should be(true)
|
255
|
+
@user.has_any_role?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => Forum.last }).should be(true)
|
244
256
|
@user.has_any_role?("dummy", { :name => "dumber", :resource => Forum.last }).should be(false)
|
245
257
|
end
|
246
258
|
end
|
@@ -248,17 +260,35 @@ shared_examples_for "Rolify module" do
|
|
248
260
|
end
|
249
261
|
|
250
262
|
describe Rolify do
|
251
|
-
context "using default Role and User class names" do
|
263
|
+
context "using default Role and User class names with dynamic shortcuts", true do
|
264
|
+
it_behaves_like "Rolify module" do
|
265
|
+
let(:user_cname) { User }
|
266
|
+
let(:role_cname) { Role }
|
267
|
+
let(:dynamic_shortcuts) { true }
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
context "using default Role and User class names without dynamic shortcuts", false do
|
252
272
|
it_behaves_like "Rolify module" do
|
253
273
|
let(:user_cname) { User }
|
254
274
|
let(:role_cname) { Role }
|
275
|
+
let(:dynamic_shortcuts) { false }
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context "using custom User and Role class names with dynamic shortcuts", true do
|
280
|
+
it_behaves_like "Rolify module" do
|
281
|
+
let(:user_cname) { Customer }
|
282
|
+
let(:role_cname) { Privilege }
|
283
|
+
let(:dynamic_shortcuts) { true }
|
255
284
|
end
|
256
|
-
|
285
|
+
end
|
257
286
|
|
258
|
-
context "using custom User and Role class names" do
|
287
|
+
context "using custom User and Role class names without dynamic shortcuts", false do
|
259
288
|
it_behaves_like "Rolify module" do
|
260
289
|
let(:user_cname) { Customer }
|
261
290
|
let(:role_cname) { Privilege }
|
291
|
+
let(:dynamic_shortcuts) { false }
|
262
292
|
end
|
263
293
|
end
|
264
294
|
end
|
metadata
CHANGED
@@ -1,50 +1,49 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rolify
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.7.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Florent Monbillard
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-08-26 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: sqlite3
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &79887380 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :development
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: activerecord
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *79887380
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activerecord
|
27
|
+
requirement: &79887130 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
29
|
+
requirements:
|
32
30
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
31
|
+
- !ruby/object:Gem::Version
|
34
32
|
version: 3.1.0.rc1
|
35
33
|
type: :runtime
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *79887130
|
36
|
+
description: ! 'Very simple Roles library without any authorization enforcement (built
|
37
|
+
to use with cancan) supporting scope on resource: user.is_moderator?(Forum.first)
|
38
|
+
=> # return false if user is moderator of another Forum '
|
39
|
+
email:
|
39
40
|
- f.monbillard@gmail.com
|
40
41
|
executables: []
|
41
|
-
|
42
42
|
extensions: []
|
43
|
-
|
44
43
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
44
|
+
files:
|
47
45
|
- .gitignore
|
46
|
+
- .travis.yml
|
48
47
|
- CHANGELOG.rdoc
|
49
48
|
- Gemfile
|
50
49
|
- LICENSE
|
@@ -56,7 +55,6 @@ files:
|
|
56
55
|
- lib/generators/rolify/role/templates/role.rb
|
57
56
|
- lib/rolify.rb
|
58
57
|
- lib/rolify/role.rb
|
59
|
-
- lib/rolify/rolify_railtie.rb
|
60
58
|
- lib/rolify/version.rb
|
61
59
|
- rolify.gemspec
|
62
60
|
- spec/rolify/role_spec.rb
|
@@ -67,30 +65,26 @@ files:
|
|
67
65
|
- spec/support/schema.rb
|
68
66
|
homepage: https://github.com/EppO/rolify
|
69
67
|
licenses: []
|
70
|
-
|
71
68
|
post_install_message:
|
72
69
|
rdoc_options: []
|
73
|
-
|
74
|
-
require_paths:
|
70
|
+
require_paths:
|
75
71
|
- lib
|
76
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
73
|
none: false
|
78
|
-
requirements:
|
79
|
-
- -
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version:
|
82
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
79
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
88
84
|
requirements: []
|
89
|
-
|
90
85
|
rubyforge_project: rolify
|
91
|
-
rubygems_version: 1.
|
86
|
+
rubygems_version: 1.8.5
|
92
87
|
signing_key:
|
93
88
|
specification_version: 3
|
94
89
|
summary: Roles library with resource scoping
|
95
90
|
test_files: []
|
96
|
-
|