rolify 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,3 +4,8 @@ gem "activerecord", :require => "active_record"
4
4
 
5
5
  # Specify your gem's dependencies in rolify.gemspec
6
6
  gemspec
7
+
8
+ group :test do
9
+ gem "sqlite3"
10
+ gem "rspec"
11
+ end
data/README.rdoc CHANGED
@@ -8,6 +8,18 @@ Let's see an example:
8
8
 
9
9
  This library was intended to be used with CanCan[https://github.com/ryanb/cancan] and devise[https://github.com/plataformatec/devise/] but should be generic enough to be used by any other authentication/authorization solutions.
10
10
 
11
+ == DISCLAIMER : still in early stage of development. Like a pre-alpha release, kind of ;-) You've been warned !
12
+
13
+ Status:
14
+
15
+ (x) generators
16
+
17
+ (x) migration file
18
+
19
+ ( ) specs
20
+
21
+ ( ) code
22
+
11
23
  == Requirements
12
24
 
13
25
  * >= Rails 3
@@ -0,0 +1,22 @@
1
+ module Rolify
2
+ def has_role(role, resource = nil)
3
+ role = Role.find_or_create_by_name_and_resource_type_and_resource_id( :name => role,
4
+ :resource_type => (resource.class.name if resource),
5
+ :resource_id => (resource.id if resource))
6
+ self.roles << role if !roles.include?(role)
7
+ end
8
+
9
+ def has_role?(role, resource = nil)
10
+ global_role_query = "((name = ?) AND (resource_type IS NULL) AND (resource_id IS NULL))"
11
+ if resource
12
+ self.roles.where("#{global_role_query} OR ((name = ?) AND (resource_type = ?) AND (resource_id = ?))",
13
+ role, role, resource.class.name, resource.id).size > 0
14
+ else
15
+ self.roles.where(global_role_query, role).size > 0
16
+ end
17
+ end
18
+
19
+ def roles_name
20
+ self.roles.select(:name).map { |r| r.name }
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module Rolify
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/rolify.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Rolify
2
- # Your code goes here...
3
- end
1
+ require 'active_record'
2
+
3
+ require 'rolify/role'
data/rolify.gemspec CHANGED
@@ -18,4 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
- end
21
+
22
+ s.add_development_dependency "sqlite3"
23
+ s.add_dependency "activerecord", "~> 3.1.0.rc1"
24
+ end
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+
3
+ describe "Rolify::Role" do
4
+
5
+ context "with a global role" do
6
+ before(:all) do
7
+ @admin = User.first
8
+ @admin.has_role "admin"
9
+ end
10
+
11
+ it "should set a global role" do
12
+ expect { @admin.has_role "superadmin" }.to change{ Role.count }.by(1)
13
+ superadmin = Role.last
14
+ superadmin.name.should eq("superadmin")
15
+ superadmin.resource.should be(nil)
16
+ end
17
+
18
+ it "should not create another role if already existing" do
19
+ expect { @admin.has_role "admin" }.not_to change{ Role.count }
20
+ expect { @admin.has_role "admin" }.not_to change{ @admin.roles.size }
21
+ end
22
+
23
+ it "should get a global role" do
24
+ @admin.has_role?("admin").should be(true)
25
+ end
26
+
27
+ it "should get any resource request" do
28
+ @admin.has_role?("admin", Forum.first).should be(true)
29
+ end
30
+
31
+ it "should not get another global role" do
32
+ Role.create(:name => "global")
33
+ @admin.has_role?("global").should be(false)
34
+ end
35
+
36
+ it "should not get a scoped role" do
37
+ @admin.has_role?("moderator", Forum.last).should be(false)
38
+ end
39
+
40
+ it "should not get inexisting role" do
41
+ @admin.has_role?("dummy").should be(false)
42
+ @admin.has_role?("dumber", Forum.first).should be(false)
43
+ end
44
+ end
45
+
46
+ context "with a scoped role" do
47
+ before(:all) do
48
+ @moderator = User.last
49
+ @moderator.has_role "moderator", Forum.first
50
+ end
51
+
52
+ it "should set a scoped role" do
53
+ @moderator
54
+ end
55
+
56
+ it "should not create another role if already existing" do
57
+ expect { @moderator.has_role "moderator", Forum.first }.not_to change{ Role.count }
58
+ expect { @moderator.has_role "moderator" , Forum.first }.not_to change{ @moderator.roles.size }
59
+ end
60
+
61
+ it "should get a scoped role" do
62
+ expect { @moderator.has_role "supermodo", Forum.last }.to change{ Role.count }.by(1)
63
+ supermodo = Role.last
64
+ supermodo.name.should eq("supermodo")
65
+ supermodo.resource.should eq(Forum.last)
66
+ end
67
+
68
+ it "should not get a global role" do
69
+ @moderator.has_role?("admin").should be(false)
70
+ end
71
+
72
+ it "should not get the same role on another resource" do
73
+ Role.create(:name => "moderator", :resource => Forum.last)
74
+ @moderator.has_role?("moderator", Forum.last).should be(false)
75
+ end
76
+
77
+ it "should not get the another role on the same resource" do
78
+ Role.create(:name => "tourist", :resource => Forum.first)
79
+ @moderator.has_role?("tourist", Forum.first).should be(false)
80
+ end
81
+
82
+ it "should not get inexisting role" do
83
+ @moderator.has_role?("dummy", Forum.last).should be(false)
84
+ @moderator.has_role?("dumber").should be(false)
85
+ end
86
+ end
87
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,11 @@
1
- re 'rubygems'
1
+ require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
- Bundler.require(:default)
4
+ Bundler.require(:default, :test)
5
+
6
+ require 'rolify'
7
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
8
+
9
+ load File.dirname(__FILE__) + '/support/schema.rb'
10
+ load File.dirname(__FILE__) + '/support/models.rb'
11
+ load File.dirname(__FILE__) + '/support/data.rb'
@@ -0,0 +1,5 @@
1
+ User.create(:login => "admin")
2
+ User.create(:login => "moderator")
3
+ Forum.create(:name => "forum 1")
4
+ Forum.create(:name => "forum 2")
5
+ Forum.create(:name => "forum 3")
@@ -0,0 +1,12 @@
1
+ class User < ActiveRecord::Base
2
+ has_and_belongs_to_many :roles, :join_table => :users_roles
3
+ include Rolify
4
+ end
5
+
6
+ class Role < ActiveRecord::Base
7
+ has_and_belongs_to_many :users, :join_table => :users_roles
8
+ belongs_to :resource, :polymorphic => true
9
+ end
10
+
11
+ class Forum < ActiveRecord::Base
12
+ end
@@ -0,0 +1,23 @@
1
+ ActiveRecord::Schema.define do
2
+ self.verbose = false
3
+
4
+ create_table(:roles) do |t|
5
+ t.string :name
6
+ t.references :resource, :polymorphic => true
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ create_table(:users) do |t|
12
+ t.string :login
13
+ end
14
+
15
+ create_table(:users_roles, :id => false) do |t|
16
+ t.references :user
17
+ t.references :role
18
+ end
19
+
20
+ create_table(:forums) do |t|
21
+ t.string :name
22
+ end
23
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rolify
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Florent Monbillard
@@ -10,9 +10,31 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-06-03 00:00:00 Z
14
- dependencies: []
15
-
13
+ date: 2011-06-04 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: sqlite3
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :development
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 3.1.0.rc1
36
+ type: :runtime
37
+ version_requirements: *id002
16
38
  description: "Very simple Roles library without any authorization enforcement (built to use with cancan) supporting scope on object: user.is_moderator?(Forum.first) => # return false if user is moderator of another Forum "
17
39
  email:
18
40
  - f.monbillard@gmail.com
@@ -32,10 +54,16 @@ files:
32
54
  - lib/generators/rolify/role/templates/migration.rb
33
55
  - lib/generators/rolify/role/templates/role.rb
34
56
  - lib/rolify.rb
57
+ - lib/rolify/role.rb
35
58
  - lib/rolify/version.rb
36
59
  - rolify.gemspec
60
+ - spec/rolify/role_spec.rb
37
61
  - spec/spec.opts
38
62
  - spec/spec_helper.rb
63
+ - spec/support/data.rb
64
+ - spec/support/models.rb
65
+ - spec/support/schema.rb
66
+ has_rdoc: true
39
67
  homepage: https://github.com/EppO/rolify
40
68
  licenses: []
41
69
 
@@ -59,9 +87,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
87
  requirements: []
60
88
 
61
89
  rubyforge_project: rolify
62
- rubygems_version: 1.7.2
90
+ rubygems_version: 1.6.2
63
91
  signing_key:
64
92
  specification_version: 3
65
93
  summary: Roles library with object scoping
66
- test_files: []
67
-
94
+ test_files:
95
+ - spec/rolify/role_spec.rb
96
+ - spec/spec.opts
97
+ - spec/spec_helper.rb
98
+ - spec/support/data.rb
99
+ - spec/support/models.rb
100
+ - spec/support/schema.rb