easy_roles 1.2.0 → 2.0.0.beta1
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/CHANGELOG.rdoc +4 -0
- data/Manifest +2 -0
- data/README.rdoc +12 -21
- data/Rakefile +2 -2
- data/easy_roles.gemspec +3 -3
- data/lib/easy_roles.rb +18 -94
- data/lib/methods/bitmask.rb +55 -0
- data/lib/methods/serialize.rb +45 -0
- data/spec/easy_roles_spec.rb +1 -1
- metadata +12 -8
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
=== 18 August 2011 - Version 2.0.0.beta
|
2
|
+
Rewrite the whole gem to be more modular, API is exactly the same
|
3
|
+
Only supports Rails 3.x
|
4
|
+
|
1
5
|
=== 06 September 2010 - Version 1.1.0
|
2
6
|
Fixed the issue where the is_user? method was not working through association, if the is_user? method had not been called before
|
3
7
|
Wrote tests (FINALLY!!!)
|
data/Manifest
CHANGED
@@ -11,6 +11,8 @@ lib/generators/active_record/templates/migration_bitmask.rb
|
|
11
11
|
lib/generators/active_record/templates/migration_non_bitmask.rb
|
12
12
|
lib/generators/easy_roles/easy_roles_generator.rb
|
13
13
|
lib/generators/templates/README
|
14
|
+
lib/methods/bitmask.rb
|
15
|
+
lib/methods/serialize.rb
|
14
16
|
spec/easy_roles_spec.rb
|
15
17
|
spec/spec_helper.rb
|
16
18
|
Manifest
|
data/README.rdoc
CHANGED
@@ -8,8 +8,6 @@ Please read the CHANGELOG.rdoc file.
|
|
8
8
|
|
9
9
|
== Install
|
10
10
|
|
11
|
-
gem install gemcutter
|
12
|
-
gem tumble
|
13
11
|
gem install easy_roles
|
14
12
|
|
15
13
|
or it can be installed as a rails plugin.
|
@@ -20,19 +18,17 @@ or it can be installed as a rails plugin.
|
|
20
18
|
|
21
19
|
=== Serialize Method
|
22
20
|
|
23
|
-
Add the following to your
|
21
|
+
Add the following to your Gemfile:
|
22
|
+
gem 'easy_roles'
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
(from version 0.3.0) use the migration generator
|
28
|
-
|
29
|
-
script/generate easy_roles user roles
|
24
|
+
Then generate the migration:
|
25
|
+
rails g easy_roles user roles
|
30
26
|
|
31
27
|
Or add a "roles" column to your users model, and set the default value to "--- []". Please note you can call this column anything you like, I like to use the name "roles".
|
32
28
|
|
33
29
|
t.string :roles, :default => "--- []"
|
34
30
|
|
35
|
-
Then you need to add "easy_roles :column_name" to your model
|
31
|
+
Then you need to add "easy_roles :column_name" to your model:
|
36
32
|
|
37
33
|
class User < ActiveRecord::Base
|
38
34
|
easy_roles :roles
|
@@ -40,17 +36,15 @@ Then you need to add "easy_roles :column_name" to your model.
|
|
40
36
|
|
41
37
|
=== Bitmask Method
|
42
38
|
|
43
|
-
|
44
|
-
|
45
|
-
Add the following to your enviroment.rb in the rails initializer block
|
46
|
-
|
47
|
-
config.gem 'easy_roles', :source => 'http://gemcutter.org'
|
39
|
+
Add the following to your Gemfile:
|
48
40
|
|
49
|
-
|
41
|
+
gem 'easy_roles'
|
50
42
|
|
51
|
-
|
43
|
+
Then generate the migration:
|
44
|
+
|
45
|
+
rails g easy_bitmask_roles user roles
|
52
46
|
|
53
|
-
Or add a "roles_mask" column to your users model of type 'integer', and set the default value to 0. Please note you can call this column anything you like, I like to use the name "roles_mask"
|
47
|
+
Or add a "roles_mask" column to your users model of type 'integer', and set the default value to 0. Please note you can call this column anything you like, I like to use the name "roles_mask":
|
54
48
|
|
55
49
|
t.integer :roles_mask, :default => 0
|
56
50
|
|
@@ -142,16 +136,13 @@ Then in your AdminsController or any controller that you only want admins to vie
|
|
142
136
|
before_filter :admin_required, :only => :create, :update
|
143
137
|
end
|
144
138
|
|
145
|
-
Check out http://blog.platform45.com/2009/10/05/howto-basic-roles-for-users for implementation, and http://blog.platform45.com/2009/10/07/easy-roles-gem-released for usage.
|
146
|
-
|
147
139
|
Follow me on twitter: http://twitter.com/ryan_za
|
148
140
|
|
149
141
|
Email: ryan *at* platform45.com
|
150
142
|
|
151
|
-
|
152
143
|
== License
|
153
144
|
|
154
|
-
Copyright (c)
|
145
|
+
Copyright (c) 2011 Platform45
|
155
146
|
|
156
147
|
Permission is hereby granted, free of charge, to any person obtaining
|
157
148
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -2,11 +2,11 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('easy_roles', '
|
5
|
+
Echoe.new('easy_roles', '2.0.0.beta1') do |p|
|
6
6
|
p.description = "Easy role authorization in rails"
|
7
7
|
p.url = "http://github.com/platform45/easy_roles"
|
8
8
|
p.author = "Platform45"
|
9
9
|
p.email = "ryan@platform45.com"
|
10
10
|
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
11
|
p.development_dependencies = ["rspec", "activerecord", "sqlite3"]
|
12
|
-
end
|
12
|
+
end
|
data/easy_roles.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{easy_roles}
|
5
|
-
s.version = "
|
5
|
+
s.version = "2.0.0.beta1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = [%q{Platform45}]
|
9
9
|
s.date = %q{2011-08-18}
|
10
10
|
s.description = %q{Easy role authorization in rails}
|
11
11
|
s.email = %q{ryan@platform45.com}
|
12
|
-
s.extra_rdoc_files = [%q{CHANGELOG.rdoc}, %q{README.rdoc}, %q{lib/easy_roles.rb}, %q{lib/generators/active_record/easy_roles_generator.rb}, %q{lib/generators/active_record/templates/migration_bitmask.rb}, %q{lib/generators/active_record/templates/migration_non_bitmask.rb}, %q{lib/generators/easy_roles/easy_roles_generator.rb}, %q{lib/generators/templates/README}]
|
13
|
-
s.files = [%q{CHANGELOG.rdoc}, %q{Gemfile}, %q{Gemfile.lock}, %q{README.rdoc}, %q{Rakefile}, %q{easy_roles.gemspec}, %q{init.rb}, %q{lib/easy_roles.rb}, %q{lib/generators/active_record/easy_roles_generator.rb}, %q{lib/generators/active_record/templates/migration_bitmask.rb}, %q{lib/generators/active_record/templates/migration_non_bitmask.rb}, %q{lib/generators/easy_roles/easy_roles_generator.rb}, %q{lib/generators/templates/README}, %q{spec/easy_roles_spec.rb}, %q{spec/spec_helper.rb}, %q{Manifest}]
|
12
|
+
s.extra_rdoc_files = [%q{CHANGELOG.rdoc}, %q{README.rdoc}, %q{lib/easy_roles.rb}, %q{lib/generators/active_record/easy_roles_generator.rb}, %q{lib/generators/active_record/templates/migration_bitmask.rb}, %q{lib/generators/active_record/templates/migration_non_bitmask.rb}, %q{lib/generators/easy_roles/easy_roles_generator.rb}, %q{lib/generators/templates/README}, %q{lib/methods/bitmask.rb}, %q{lib/methods/serialize.rb}]
|
13
|
+
s.files = [%q{CHANGELOG.rdoc}, %q{Gemfile}, %q{Gemfile.lock}, %q{README.rdoc}, %q{Rakefile}, %q{easy_roles.gemspec}, %q{init.rb}, %q{lib/easy_roles.rb}, %q{lib/generators/active_record/easy_roles_generator.rb}, %q{lib/generators/active_record/templates/migration_bitmask.rb}, %q{lib/generators/active_record/templates/migration_non_bitmask.rb}, %q{lib/generators/easy_roles/easy_roles_generator.rb}, %q{lib/generators/templates/README}, %q{lib/methods/bitmask.rb}, %q{lib/methods/serialize.rb}, %q{spec/easy_roles_spec.rb}, %q{spec/spec_helper.rb}, %q{Manifest}]
|
14
14
|
s.homepage = %q{http://github.com/platform45/easy_roles}
|
15
15
|
s.rdoc_options = [%q{--line-numbers}, %q{--inline-source}, %q{--title}, %q{Easy_roles}, %q{--main}, %q{README.rdoc}]
|
16
16
|
s.require_paths = [%q{lib}]
|
data/lib/easy_roles.rb
CHANGED
@@ -1,107 +1,31 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
1
3
|
module EasyRoles
|
2
|
-
|
3
|
-
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do |base|
|
4
7
|
base.send :alias_method_chain, :method_missing, :roles
|
5
8
|
base.send :alias_method_chain, :respond_to?, :roles
|
6
9
|
end
|
10
|
+
|
11
|
+
ALLOWED_METHODS = [:serialize, :bitmask]
|
12
|
+
|
13
|
+
ALLOWED_METHODS.each do |method|
|
14
|
+
autoload method.to_s.capitalize.to_sym, "methods/#{method}"
|
15
|
+
end
|
7
16
|
|
8
17
|
module ClassMethods
|
9
18
|
def easy_roles(name, options = {})
|
10
|
-
|
11
19
|
options[:method] ||= :serialize
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
ActiveSupport::Deprecation.silence do
|
17
|
-
respond_to?(:before_validation_on_create) ? before_validation_on_create(:make_default_roles) : before_validation(:make_default_roles, :on => :create)
|
18
|
-
end
|
19
|
-
|
20
|
-
class_eval <<-EOC
|
21
|
-
def has_role?(role)
|
22
|
-
#{name}.include?(role)
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_role(role)
|
26
|
-
clear_roles if self.#{name}.nil?
|
27
|
-
has_role?(role) ? false : self.#{name} << role
|
28
|
-
end
|
20
|
+
|
21
|
+
begin
|
22
|
+
raise NameError unless ALLOWED_METHODS.include? options[:method]
|
29
23
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def remove_role(role)
|
36
|
-
self.#{name}.delete(role)
|
37
|
-
end
|
38
|
-
|
39
|
-
def remove_role!(role)
|
40
|
-
remove_role(role)
|
41
|
-
self.save!
|
42
|
-
end
|
43
|
-
|
44
|
-
def clear_roles
|
45
|
-
self.#{name} = []
|
46
|
-
end
|
47
|
-
|
48
|
-
def make_default_roles
|
49
|
-
clear_roles if #{name}.nil?
|
50
|
-
end
|
24
|
+
"EasyRoles::#{options[:method].to_s.camelize}".constantize.new(self, name, options)
|
25
|
+
rescue NameError
|
26
|
+
puts "[Easy Roles] Storage method does not exist reverting to Serialize"
|
51
27
|
|
52
|
-
|
53
|
-
EOC
|
54
|
-
elsif options[:method] == :bitmask
|
55
|
-
|
56
|
-
def_name = (name == :roles) ? :easy_roles : :roles
|
57
|
-
|
58
|
-
class_eval <<-EOC
|
59
|
-
def self.list_roles
|
60
|
-
#{name.to_s.upcase}
|
61
|
-
end
|
62
|
-
|
63
|
-
def #{def_name}=(roles)
|
64
|
-
self.#{name} = (roles & #{name.to_s.upcase}).map { |r| 2**#{name.to_s.upcase}.index(r) }.sum
|
65
|
-
end
|
66
|
-
|
67
|
-
def #{def_name}
|
68
|
-
#{name.to_s.upcase}.reject { |r| ((#{name} || 0) & 2**#{name.to_s.upcase}.index(r)).zero? }
|
69
|
-
end
|
70
|
-
|
71
|
-
def has_role?(role)
|
72
|
-
#{def_name}.include?(role)
|
73
|
-
end
|
74
|
-
|
75
|
-
def add_role(role)
|
76
|
-
new_roles = #{def_name}.push(role).uniq
|
77
|
-
self.#{def_name} = new_roles
|
78
|
-
end
|
79
|
-
|
80
|
-
def add_role!(role)
|
81
|
-
add_role(role)
|
82
|
-
self.save!
|
83
|
-
end
|
84
|
-
|
85
|
-
def remove_role(role)
|
86
|
-
new_roles = #{def_name}
|
87
|
-
new_roles.delete(role)
|
88
|
-
self.#{def_name} = new_roles
|
89
|
-
end
|
90
|
-
|
91
|
-
def remove_role!(role)
|
92
|
-
remove_role(role)
|
93
|
-
self.save!
|
94
|
-
end
|
95
|
-
|
96
|
-
def clear_roles
|
97
|
-
self.#{name} = 0
|
98
|
-
end
|
99
|
-
|
100
|
-
def clear_roles!
|
101
|
-
self.#{name} = 0
|
102
|
-
self.save!
|
103
|
-
end
|
104
|
-
EOC
|
28
|
+
EasyRoles::Serialize.new(self, name, options)
|
105
29
|
end
|
106
30
|
end
|
107
31
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module EasyRoles
|
2
|
+
class Bitmask
|
3
|
+
def initialize(base, column_name, options)
|
4
|
+
base.send :define_method, :_roles= do |roles|
|
5
|
+
states = base.const_get(column_name.upcase.to_sym)
|
6
|
+
|
7
|
+
self[column_name.to_sym] = (roles & states).map { |r| 2**states.index(r) }.sum
|
8
|
+
end
|
9
|
+
|
10
|
+
base.send :define_method, :_roles do
|
11
|
+
states = base.const_get(column_name.upcase.to_sym)
|
12
|
+
|
13
|
+
states.reject { |r| ((self[column_name.to_sym] || 0) & 2**states.index(r)).zero? }
|
14
|
+
end
|
15
|
+
|
16
|
+
base.send :define_method, :has_role? do |role|
|
17
|
+
self._roles.inspect
|
18
|
+
|
19
|
+
self._roles.include?(role)
|
20
|
+
end
|
21
|
+
|
22
|
+
base.send :define_method, :add_role do |role|
|
23
|
+
new_roles = self._roles.push(role).uniq
|
24
|
+
self._roles = new_roles
|
25
|
+
end
|
26
|
+
|
27
|
+
base.send :define_method, :add_role! do |role|
|
28
|
+
add_role(role)
|
29
|
+
self.save!
|
30
|
+
end
|
31
|
+
|
32
|
+
base.send :define_method, :remove_role do |role|
|
33
|
+
new_roles = self._roles
|
34
|
+
new_roles.delete(role)
|
35
|
+
|
36
|
+
self._roles = new_roles
|
37
|
+
end
|
38
|
+
|
39
|
+
base.send :define_method, :remove_role! do |role|
|
40
|
+
remove_role(role)
|
41
|
+
self.save!
|
42
|
+
end
|
43
|
+
|
44
|
+
base.send :define_method, :clear_roles do
|
45
|
+
self[column_name.to_sym] = 0
|
46
|
+
end
|
47
|
+
|
48
|
+
base.send :define_method, :clear_roles! do
|
49
|
+
self.clear_roles
|
50
|
+
|
51
|
+
self.save!
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module EasyRoles
|
2
|
+
class Serialize
|
3
|
+
def initialize(base, column_name, options)
|
4
|
+
base.serialize column_name.to_sym, Array
|
5
|
+
|
6
|
+
ActiveSupport::Deprecation.silence do
|
7
|
+
base.before_validation(:make_default_roles, :on => :create)
|
8
|
+
end
|
9
|
+
|
10
|
+
base.send :define_method, :has_role? do |role|
|
11
|
+
self[column_name.to_sym].include?(role)
|
12
|
+
end
|
13
|
+
|
14
|
+
base.send :define_method, :add_role do |role|
|
15
|
+
clear_roles if self[column_name.to_sym].blank?
|
16
|
+
|
17
|
+
has_role?(role) ? false : self[column_name.to_sym] << role
|
18
|
+
end
|
19
|
+
|
20
|
+
base.send :define_method, :add_role! do |role|
|
21
|
+
add_role(role)
|
22
|
+
self.save!
|
23
|
+
end
|
24
|
+
|
25
|
+
base.send :define_method, :remove_role do |role|
|
26
|
+
self[column_name.to_sym].delete(role)
|
27
|
+
end
|
28
|
+
|
29
|
+
base.send :define_method, :remove_role! do |role|
|
30
|
+
remove_role(role)
|
31
|
+
self.save!
|
32
|
+
end
|
33
|
+
|
34
|
+
base.send :define_method, :clear_roles do
|
35
|
+
self[column_name.to_sym] = []
|
36
|
+
end
|
37
|
+
|
38
|
+
base.send :define_method, :make_default_roles do
|
39
|
+
clear_roles if self[column_name.to_sym].blank?
|
40
|
+
end
|
41
|
+
|
42
|
+
base.send :private, :make_default_roles
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/easy_roles_spec.rb
CHANGED
@@ -174,7 +174,7 @@ describe EasyRoles do
|
|
174
174
|
it "should allow me to set a users role" do
|
175
175
|
user = BitmaskUser.new
|
176
176
|
user.add_role 'admin'
|
177
|
-
user.
|
177
|
+
user._roles.include?("admin").should be_true
|
178
178
|
end
|
179
179
|
|
180
180
|
it "should return true for is_admin? if the admin role is added to the user" do
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_roles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0.beta1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Platform45
|
@@ -13,7 +13,7 @@ date: 2011-08-18 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &2153037320 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2153037320
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activerecord
|
27
|
-
requirement: &
|
27
|
+
requirement: &2153036840 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2153036840
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &2153036360 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2153036360
|
47
47
|
description: Easy role authorization in rails
|
48
48
|
email: ryan@platform45.com
|
49
49
|
executables: []
|
@@ -57,6 +57,8 @@ extra_rdoc_files:
|
|
57
57
|
- lib/generators/active_record/templates/migration_non_bitmask.rb
|
58
58
|
- lib/generators/easy_roles/easy_roles_generator.rb
|
59
59
|
- lib/generators/templates/README
|
60
|
+
- lib/methods/bitmask.rb
|
61
|
+
- lib/methods/serialize.rb
|
60
62
|
files:
|
61
63
|
- CHANGELOG.rdoc
|
62
64
|
- Gemfile
|
@@ -71,6 +73,8 @@ files:
|
|
71
73
|
- lib/generators/active_record/templates/migration_non_bitmask.rb
|
72
74
|
- lib/generators/easy_roles/easy_roles_generator.rb
|
73
75
|
- lib/generators/templates/README
|
76
|
+
- lib/methods/bitmask.rb
|
77
|
+
- lib/methods/serialize.rb
|
74
78
|
- spec/easy_roles_spec.rb
|
75
79
|
- spec/spec_helper.rb
|
76
80
|
- Manifest
|