acts_as_role 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ gem "rails", ">= 3.0.0"
7
+
8
+ # Add dependencies to develop your gem here.
9
+ # Include everything needed to run rake, tests, features, etc.
10
+ group :development do
11
+ gem "rspec-rails"
12
+ gem "sqlite3"
13
+ gem "bundler", "~> 1.0.0"
14
+ gem "jeweler", "~> 1.5.2"
15
+ gem "rcov", ">= 0"
16
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,113 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (3.1.0.rc4)
5
+ actionpack (= 3.1.0.rc4)
6
+ mail (~> 2.3.0)
7
+ actionpack (3.1.0.rc4)
8
+ activemodel (= 3.1.0.rc4)
9
+ activesupport (= 3.1.0.rc4)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ i18n (~> 0.6)
13
+ rack (~> 1.3.0)
14
+ rack-cache (~> 1.0.1)
15
+ rack-mount (~> 0.8.1)
16
+ rack-test (~> 0.6.0)
17
+ sprockets (~> 2.0.0.beta.10)
18
+ tzinfo (~> 0.3.27)
19
+ activemodel (3.1.0.rc4)
20
+ activesupport (= 3.1.0.rc4)
21
+ bcrypt-ruby (~> 2.1.4)
22
+ builder (~> 3.0.0)
23
+ i18n (~> 0.6)
24
+ activerecord (3.1.0.rc4)
25
+ activemodel (= 3.1.0.rc4)
26
+ activesupport (= 3.1.0.rc4)
27
+ arel (~> 2.1.1)
28
+ tzinfo (~> 0.3.27)
29
+ activeresource (3.1.0.rc4)
30
+ activemodel (= 3.1.0.rc4)
31
+ activesupport (= 3.1.0.rc4)
32
+ activesupport (3.1.0.rc4)
33
+ multi_json (~> 1.0)
34
+ arel (2.1.3)
35
+ bcrypt-ruby (2.1.4)
36
+ builder (3.0.0)
37
+ diff-lcs (1.1.2)
38
+ erubis (2.7.0)
39
+ git (1.2.5)
40
+ hike (1.2.0)
41
+ i18n (0.6.0)
42
+ jeweler (1.5.2)
43
+ bundler (~> 1.0.0)
44
+ git (>= 1.2.5)
45
+ rake
46
+ mail (2.3.0)
47
+ i18n (>= 0.4.0)
48
+ mime-types (~> 1.16)
49
+ treetop (~> 1.4.8)
50
+ mime-types (1.16)
51
+ multi_json (1.0.3)
52
+ polyglot (0.3.1)
53
+ rack (1.3.1)
54
+ rack-cache (1.0.2)
55
+ rack (>= 0.4)
56
+ rack-mount (0.8.1)
57
+ rack (>= 1.0.0)
58
+ rack-ssl (1.3.2)
59
+ rack
60
+ rack-test (0.6.0)
61
+ rack (>= 1.0)
62
+ rails (3.1.0.rc4)
63
+ actionmailer (= 3.1.0.rc4)
64
+ actionpack (= 3.1.0.rc4)
65
+ activerecord (= 3.1.0.rc4)
66
+ activeresource (= 3.1.0.rc4)
67
+ activesupport (= 3.1.0.rc4)
68
+ bundler (~> 1.0)
69
+ railties (= 3.1.0.rc4)
70
+ railties (3.1.0.rc4)
71
+ actionpack (= 3.1.0.rc4)
72
+ activesupport (= 3.1.0.rc4)
73
+ rack-ssl (~> 1.3.2)
74
+ rake (>= 0.8.7)
75
+ rdoc (~> 3.4)
76
+ thor (~> 0.14.6)
77
+ rake (0.9.2)
78
+ rcov (0.9.9)
79
+ rdoc (3.8)
80
+ rspec (2.6.0)
81
+ rspec-core (~> 2.6.0)
82
+ rspec-expectations (~> 2.6.0)
83
+ rspec-mocks (~> 2.6.0)
84
+ rspec-core (2.6.4)
85
+ rspec-expectations (2.6.0)
86
+ diff-lcs (~> 1.1.2)
87
+ rspec-mocks (2.6.0)
88
+ rspec-rails (2.6.1)
89
+ actionpack (~> 3.0)
90
+ activesupport (~> 3.0)
91
+ railties (~> 3.0)
92
+ rspec (~> 2.6.0)
93
+ sprockets (2.0.0.beta.10)
94
+ hike (~> 1.0)
95
+ rack (~> 1.0)
96
+ tilt (!= 1.3.0, ~> 1.1)
97
+ sqlite3 (1.3.3)
98
+ thor (0.14.6)
99
+ tilt (1.3.2)
100
+ treetop (1.4.9)
101
+ polyglot (>= 0.3.1)
102
+ tzinfo (0.3.29)
103
+
104
+ PLATFORMS
105
+ ruby
106
+
107
+ DEPENDENCIES
108
+ bundler (~> 1.0.0)
109
+ jeweler (~> 1.5.2)
110
+ rails (>= 3.0.0)
111
+ rcov
112
+ rspec-rails
113
+ sqlite3
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Carlos Segura
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,67 @@
1
+ = acts_as_role
2
+
3
+ This is a minimalist implementation of roles using a database column to store the roles in plain text. You can specify the role values and a default role that should be used when model is initialized.
4
+
5
+ class User < ActiveRecord::Base
6
+ acts_as_role :role, :values = %w(admin owner user), :default => :user
7
+ end
8
+
9
+ Use role field to store the user roles.
10
+
11
+ user = User.new
12
+ user.role = "user"
13
+ user.has_role?(:user) => true
14
+
15
+ Test roles using has_#{role_column.singularize}? or has_#{role_column.pluralize}?
16
+
17
+ user.has_roles?(:user, :admin) => false
18
+
19
+ user.add_roles :owner
20
+ user.has_roles?(:user, :owner) => true
21
+
22
+ Roles are stores using text
23
+
24
+ user.roles => "user_owner"
25
+
26
+ user.remove_roles(:user)
27
+ user.has_role?(:user) => false
28
+ user.roles => "owner"
29
+
30
+ Validation - internally there is a roles validator
31
+
32
+ user.add_roles :not_specified
33
+ user.valid? => false
34
+ user.errors[:roles] => "contains an invalid role"
35
+
36
+ You can use a different field with different syntax
37
+
38
+ class Access < ActiveRecord::Base
39
+ acts_as_role :flag, :values => %w(owner manager employee), :message => "invalid role"
40
+ end
41
+
42
+ access = Access.new
43
+ access.flag => nil
44
+ access.add_flags(:owner)
45
+ access.has_flag?(:owner) => true
46
+ access.add_flags(:manager)
47
+ access.has_flags?(:manager, :owner) => true
48
+ access.flag => manager_owner
49
+ access.add_flags :invalid
50
+ access.valid? => false
51
+ access.errors[:flag] => "invalid role"
52
+
53
+ == Contributing to has_roles
54
+
55
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
56
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
57
+ * Fork the project
58
+ * Start a feature/bugfix branch
59
+ * Commit and push until you are happy with your contribution
60
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
61
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
62
+
63
+ == Copyright
64
+
65
+ Copyright (c) 2011 Carlos Segura. See LICENSE.txt for
66
+ further details.
67
+
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "acts_as_role"
16
+ gem.homepage = "http://github.com/csegura/acts_as_role"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{Minimalist implementation of roles}
19
+ gem.description = %Q{Use a field to store plain-text roles and manage them easily}
20
+ gem.email = "csegura@ideseg.com"
21
+ gem.authors = ["Carlos Segura"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
+ spec.pattern = 'spec/**/*_spec.rb'
37
+ spec.rcov = true
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'rake/rdoctask'
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "has_roles #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,79 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{acts_as_role}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Carlos Segura"]
12
+ s.date = %q{2011-07-25}
13
+ s.description = %q{Use a field to store plain-text roles and manage them easily}
14
+ s.email = %q{csegura@ideseg.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "acts_as_role.gemspec",
29
+ "lib/acts_as_role.rb",
30
+ "lib/roles_validator.rb",
31
+ "spec/access_spec.rb",
32
+ "spec/models/access.rb",
33
+ "spec/models/user.rb",
34
+ "spec/spec_helper.rb",
35
+ "spec/support/setup_database.rb",
36
+ "spec/user_spec.rb"
37
+ ]
38
+ s.homepage = %q{http://github.com/csegura/acts_as_role}
39
+ s.licenses = ["MIT"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = %q{1.6.2}
42
+ s.summary = %q{Minimalist implementation of roles}
43
+ s.test_files = [
44
+ "spec/access_spec.rb",
45
+ "spec/models/access.rb",
46
+ "spec/models/user.rb",
47
+ "spec/spec_helper.rb",
48
+ "spec/support/setup_database.rb",
49
+ "spec/user_spec.rb"
50
+ ]
51
+
52
+ if s.respond_to? :specification_version then
53
+ s.specification_version = 3
54
+
55
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<rails>, [">= 3.0.0"])
57
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
58
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
59
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
60
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
61
+ s.add_development_dependency(%q<rcov>, [">= 0"])
62
+ else
63
+ s.add_dependency(%q<rails>, [">= 3.0.0"])
64
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
65
+ s.add_dependency(%q<sqlite3>, [">= 0"])
66
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
68
+ s.add_dependency(%q<rcov>, [">= 0"])
69
+ end
70
+ else
71
+ s.add_dependency(%q<rails>, [">= 3.0.0"])
72
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
73
+ s.add_dependency(%q<sqlite3>, [">= 0"])
74
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
75
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
76
+ s.add_dependency(%q<rcov>, [">= 0"])
77
+ end
78
+ end
79
+
@@ -0,0 +1,83 @@
1
+ module ActsAsRole
2
+
3
+ module Role
4
+
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ attr_accessor :rolez
9
+ end
10
+
11
+ module ClassMethods
12
+ def acts_as_role column, options={}
13
+
14
+ options.symbolize_keys!
15
+
16
+ define_method "setup_roles_for_#{column}" do
17
+ self.setup_roles self.send(column), options, column
18
+ end
19
+
20
+ define_method "save_roles" do
21
+ self.send("#{column}=",@rolez.join("_")) if @rolez
22
+ end
23
+
24
+ options[:values].each do |role|
25
+ define_method "is_#{role}?" do
26
+ @rolez && @rolez.include?(role.to_sym)
27
+ end
28
+ end
29
+
30
+ define_method "add_#{column.to_s.pluralize}" do |*roles|
31
+ roles.each {|x| @rolez << x if not @rolez.include?(x) }
32
+ save_roles
33
+ end
34
+
35
+ define_method "remove_#{column.to_s.pluralize}" do |*roles|
36
+ roles.each {|x| @rolez.delete(x) }
37
+ save_roles
38
+ end
39
+
40
+ define_method "has_#{column.to_s.pluralize}?" do |*roles|
41
+ @rolez && roles.flatten.map { |r| r.to_sym }.all? { |r| @rolez.include?(r) }
42
+ end
43
+
44
+ define_method "has_#{column.to_s.singularize}?" do |role|
45
+ @rolez && @rolez.include?(role)
46
+ end
47
+
48
+ define_method "list_#{column.to_s.pluralize}" do
49
+ @rolez
50
+ end
51
+
52
+ define_method "available_#{column.to_s.pluralize}" do
53
+ "#{options[:values].to_a}"
54
+ end
55
+
56
+ after_initialize "setup_roles_for_#{column}".to_sym
57
+
58
+ validates "#{column}".to_sym, :roles => { :roles => options[:values], :message => options[:message] }
59
+
60
+ end
61
+ end
62
+
63
+ def setup_roles role, options, column
64
+ role = setup_default_role role, options, column
65
+ @rolez = role.nil? ? [] : role.split("_").collect(&:to_sym)
66
+ save_roles
67
+ end
68
+
69
+ private
70
+
71
+ def setup_default_role role, options, column
72
+ if (role.nil? || role.empty?) && options[:default]
73
+ options[:default] = [options[:default].to_s] if options[:default].is_a?(Symbol)
74
+ role = options[:default]*"_"
75
+ else
76
+ role
77
+ end
78
+ end
79
+
80
+ end
81
+ end
82
+
83
+ ActiveRecord::Base.send(:include, ActsAsRole::Role)
@@ -0,0 +1,12 @@
1
+
2
+ class RolesValidator < ActiveModel::EachValidator
3
+ def initialize(options)
4
+ @roles = options[:roles]
5
+ super
6
+ end
7
+ def validate_each(record, attribute, value)
8
+ unless value.split("_").all? {|x| @roles.include?(x) }
9
+ record.errors[attribute] << (options[:message] || "contains an invalid role")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Access do
4
+ describe "defaults" do
5
+ before do
6
+ @access = Access.new
7
+ end
8
+ it "should have default role :Access" do
9
+ @access.flag.should be_empty
10
+ end
11
+ end
12
+
13
+ describe "should have available roles" do
14
+ before do
15
+ @access = Access.new
16
+ end
17
+ it "has some roles available" do
18
+ @access.available_flags.length == 3
19
+ end
20
+ it "has some roles available" do
21
+ # @access.available_roles.should == %w(Access admin editor reader)
22
+ end
23
+ end
24
+
25
+ describe "should permit add roles" do
26
+ before(:each) do
27
+ @access = Access.new
28
+ @access.add_flags :owner
29
+ end
30
+ it "and check these" do
31
+ @access.has_flag?(:owner).should be_true
32
+ end
33
+ it "more than once" do
34
+ @access.add_flags :manager
35
+ @access.has_flags?(:owner, :manager)
36
+ end
37
+ end
38
+
39
+ describe "should persist" do
40
+ before(:each) do
41
+ @access = Access.new
42
+ @access.add_flags :manager
43
+ end
44
+ it "when store it in database" do
45
+ @access.save.should be_true
46
+ end
47
+ it "when store it in database" do
48
+ @access.add_flags :owner
49
+ @access.save
50
+ access = Access.find(@access.id)
51
+ access.has_flags?(:manager, :owner).should be_true
52
+ end
53
+ it "should fails when try to save invalid roles" do
54
+ @access.add_flags :invalid
55
+ @access.save.should be_false
56
+ end
57
+ it "should invalid if added an invalid role" do
58
+ @access.add_flags :invalid
59
+ @access.valid?.should be_false
60
+ end
61
+ it "should contains error message if added and invalid role" do
62
+ @access.add_flags :invalid
63
+ @access.valid?.should be_false
64
+ @access.errors[:flag].should include("invalid role")
65
+ end
66
+ end
67
+
68
+ describe "should permit remove roles and check for this" do
69
+ before(:each) do
70
+ @access = Access.new
71
+ @access.add_flags :owner, :manager
72
+ end
73
+ it "should permit remove roles" do
74
+ @access.remove_flags :manager
75
+ @access.has_flags?(:owner, :manager).should be_false
76
+ @access.has_flags?(:manager).should be_false
77
+ end
78
+ end
79
+
80
+ describe "should respond to is_role?" do
81
+ before(:each) do
82
+ @access = Access.new
83
+ @access.add_flags :owner, :manager
84
+ end
85
+ it "respond to roles" do
86
+ @access.is_owner?.should be_true
87
+ @access.is_manager?.should be_true
88
+ @access.is_employee?.should be_false
89
+ end
90
+ end
91
+
92
+ end
@@ -0,0 +1,3 @@
1
+ class Access < ActiveRecord::Base
2
+ acts_as_role :flag, :values => %w(owner manager employee), :message => "invalid role"
3
+ end
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ acts_as_role :roles, :values => %w(user admin editor reader), :default => :user
3
+ end
@@ -0,0 +1,18 @@
1
+
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+
5
+ #require File.expand_path("../dummy/config/environment.rb", __FILE__)
6
+
7
+ require 'rspec'
8
+ require 'rails/all'
9
+ require 'acts_as_role'
10
+ require 'roles_validator'
11
+
12
+ # Requires supporting files with custom matchers and macros, etc,
13
+ # in ./support/ and its subdirectories.
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
+ Dir["#{File.dirname(__FILE__)}/models/**/*.rb"].each {|f| require f}
16
+
17
+ RSpec.configure do |config|
18
+ end
@@ -0,0 +1,22 @@
1
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
2
+
3
+ def setup_db
4
+ ActiveRecord::Schema.define(:version => 1) do
5
+ create_table :users do |t|
6
+ t.string :name
7
+ t.string :roles
8
+ end
9
+ create_table :accesses do |t|
10
+ t.string :name
11
+ t.string :flag
12
+ end
13
+ end
14
+ end
15
+
16
+ def teardown_db
17
+ ActiveRecord::Base.connection.tables.each do |table|
18
+ ActiveRecord::Base.connection.drop_table(table)
19
+ end
20
+ end
21
+
22
+ setup_db
data/spec/user_spec.rb ADDED
@@ -0,0 +1,99 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe User do
4
+ describe "should have default role user" do
5
+ before do
6
+ @user = User.new
7
+ end
8
+ it "should have default role :user" do
9
+ @user.roles.should == "user"
10
+ end
11
+ it "should has_role?(:user)" do
12
+ @user.has_role?(:user).should be_true
13
+ end
14
+ it "should has_roles?(:user)" do
15
+ @user.has_roles?(:user).should be_true
16
+ end
17
+ end
18
+
19
+ describe "should have available roles" do
20
+ before do
21
+ @user = User.new
22
+ end
23
+ it "has some roles available" do
24
+ @user.available_roles.length == 4
25
+ end
26
+ it "has some roles available" do
27
+ # @user.available_roles.should == %w(user admin editor reader)
28
+ end
29
+ end
30
+
31
+ describe "should permit add roles" do
32
+ before do
33
+ @user = User.new
34
+ @user.add_roles :admin
35
+ end
36
+ it "and check these" do
37
+ @user.has_role?(:admin)
38
+ @user.has_roles?(:user, :admin)
39
+ @user.has_roles?(:admin, :user)
40
+ end
41
+ it "more than once" do
42
+ @user.add_roles :admin, :editor, :reader
43
+ @user.has_roles?(:admin, :editor, :reader)
44
+ end
45
+ end
46
+
47
+ describe "should persist" do
48
+ before(:each) do
49
+ @user = User.new
50
+ @user.add_roles :admin
51
+ end
52
+ it "when store it in database" do
53
+ @user.save.should be_true
54
+ end
55
+ it "when store it in database" do
56
+ @user.save
57
+ user = User.find(@user.id)
58
+ user.has_roles?(:user, :admin).should be_true
59
+ end
60
+ it "should fails when try to save invalid roles" do
61
+ @user.add_roles :invalid
62
+ @user.save.should be_false
63
+ end
64
+ it "should invalid if added an invalid role" do
65
+ @user.add_roles :invalid
66
+ @user.valid?.should be_false
67
+ end
68
+ it "should contains error message if added and invalid role" do
69
+ @user.add_roles :invalid
70
+ @user.valid?.should be_false
71
+ @user.errors[:roles].should include("contains an invalid role")
72
+ end
73
+ end
74
+
75
+ describe "should permit remove roles and check for this" do
76
+ before(:each) do
77
+ @user = User.new
78
+ @user.add_roles :admin, :editor
79
+ end
80
+ it "should permit remove roles" do
81
+ @user.remove_roles :editor
82
+ @user.has_roles?(:user, :admin).should be_true
83
+ @user.has_role?(:editor).should be_false
84
+ end
85
+ end
86
+
87
+ describe "should respond to is_role?" do
88
+ before(:each) do
89
+ @user = User.new
90
+ @user.add_roles :editor
91
+ end
92
+ it "sample roles" do
93
+ @user.is_user?.should be_true
94
+ @user.is_editor?.should be_true
95
+ @user.is_admin?.should be_false
96
+ end
97
+ end
98
+
99
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_role
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.2.0
6
+ platform: ruby
7
+ authors:
8
+ - Carlos Segura
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-25 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rails
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 3.0.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-rails
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: sqlite3
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: bundler
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.0
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: jeweler
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 1.5.2
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rcov
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ description: Use a field to store plain-text roles and manage them easily
83
+ email: csegura@ideseg.com
84
+ executables: []
85
+
86
+ extensions: []
87
+
88
+ extra_rdoc_files:
89
+ - LICENSE.txt
90
+ - README.rdoc
91
+ files:
92
+ - .document
93
+ - .rspec
94
+ - Gemfile
95
+ - Gemfile.lock
96
+ - LICENSE.txt
97
+ - README.rdoc
98
+ - Rakefile
99
+ - VERSION
100
+ - acts_as_role.gemspec
101
+ - lib/acts_as_role.rb
102
+ - lib/roles_validator.rb
103
+ - spec/access_spec.rb
104
+ - spec/models/access.rb
105
+ - spec/models/user.rb
106
+ - spec/spec_helper.rb
107
+ - spec/support/setup_database.rb
108
+ - spec/user_spec.rb
109
+ has_rdoc: true
110
+ homepage: http://github.com/csegura/acts_as_role
111
+ licenses:
112
+ - MIT
113
+ post_install_message:
114
+ rdoc_options: []
115
+
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ hash: -3469102273411357801
124
+ segments:
125
+ - 0
126
+ version: "0"
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
133
+ requirements: []
134
+
135
+ rubyforge_project:
136
+ rubygems_version: 1.6.2
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: Minimalist implementation of roles
140
+ test_files:
141
+ - spec/access_spec.rb
142
+ - spec/models/access.rb
143
+ - spec/models/user.rb
144
+ - spec/spec_helper.rb
145
+ - spec/support/setup_database.rb
146
+ - spec/user_spec.rb